2楼insert函数返回static指针的做法不推荐,虽然这并不能算是什么错误,但是因为对于一个函数,如果输入相同,那么输出也应该相同,否则这个函数多次调用就有可能产生一些怪异的结果。现举例如下。
我们不对insert函数做任何改变,仅仅改变main函数的内容:
int main(void)
{
char s1[20] = "aaaaaaaa";
char s2[20] = "2222";
int m = 4;
char s[20] = {0};
char *s3 = s;
char a1[20] = "aaaa2222aaaa";
s3 = insert(s1, s2, m);
printf("after 1st insert: ");
printf("%s\n", s3);
s3 = insert(s1, s2, m);
printf("after 2nd insert: ");
printf("%s\n", s3);
/* 此时 s3 指向的字符串为 "aaaa2222aaaa",我们想给s3中间再次插入s2,所以,
我们预期的结果应该是这样:"aaaa22222222aaaa"
*/
s3 = insert(s3, s2, m);
printf("after 3rd insert: ");
printf("%s\n", s3); // 注意观察这个printf函数的输出
/* 此时 a1 指向的字符串为 "aaaa2222aaaa",和紧上面调用insert函数前
s3的内容相同,我们也想给a1中间插入s2, 以期同样得到:"aaaa22222222aaaa"
*/
s3 = insert(a1, s2, m);
printf("after 4th insert: ");
printf("%s\n", s3); // 也注意观察这个printf函数的输出
return 0;
}
我们看看输出:
after 1st insert: aaaa2222aaaa
after 2nd insert: aaaa2222aaaa
after 3rd insert: aaaa2222222222222222222222222222222222222222222222229|B
after 4th insert: aaaa22222222aaaa
显然第1次调用和第2次调用的结果相同,符合我们的预期;但是第3次调用和第4次调用的结果却大相径庭。至于产生这种情况的原因,就留给有心人去思考吧。
BTW:
参考《华为编程规范与范例》的6-6部分:
"6-6:函数的功能应该是可以预测的,也就是只要输入数据相同就应产生同样的输出。"