#include <stdio.h>
int main(void)
{
char a[100] = "hi";
strcat(a, a);
strcat(a, a);
printf("%s\n", a);
return 0;
}
答案 0 :(得分:9)
根据C语言标准中strcat
的定义,§7.21.3.1/2
If copying takes place between objects that overlap, the behavior is undefined.
我的编译器即使完成一次也会崩溃,因为strcat(a, a);
将第二个参数的第一个字符复制到第一个参数末尾的'\ 0',然后是第二个参数的第二个字符。等等,直到它遇到第二个参数中的'\ 0'..这种情况从未发生过,因为复制第一个字符时'\ 0'消失了。
答案 1 :(得分:5)
来自strcat(3)手册页:
DESCRIPTION
The strcat() and strncat() functions append a copy of the null-terminated
string s2 to the end of the null-terminated string s1, then add a termi-
nating '\0'. The string s1 must have sufficient space to hold the
result.
The strncat() function appends not more than n characters from s2, and
then adds a terminating
\ 0'。<强>
The source and destination strings should not overlap, as the behavior is
undefined.
答案 2 :(得分:2)
这是未定义的行为。
如果你处于循环中,从字符串中读取每个char
,直到找到\0
,但同时你将字符追加(写入)到它的末尾,循环什么时候结束?
答案 3 :(得分:0)
我怀疑这是因为实现在最后覆盖了空字节:
Start: a = {h,i,\0}
src^ vdst
next: a = {h,i,h}
src^ vdst
next: a = {h,i,h,i}
src^ vdst
next: a = {h,i,h,i,h}
...
因为你覆盖了null终止符,你的源字符串将永远不会结束,并且该方法将继续复制,直到它尝试访问它不应该访问的内存和段错误。