将字符串与自身连接两次会导致分段错误 #包括 内部主(空) { 字符a[100]=“hi”; strcat(a,a); strcat(a,a); printf(“%s\n”,a); 返回0; }
根据C语言标准中strcat的定义,将字符串与自身连接两次会导致分段错误 #包括 内部主(空) { 字符a[100]=“hi”; strcat(a,a); strcat(a,a); printf(“%s\n”,a); 返回0; },c,string,C,String,根据C语言标准中strcat的定义,§7.21.3.1/2 如果复制发生在重叠的对象之间,则行为未定义。 我的编译器即使只运行一次也会崩溃,如strcat(a,a)将第二个参数的第一个字符复制到第一个参数末尾的“\0”上,然后复制它后面的第二个参数的第二个字符,依此类推,直到它在第二个参数中遇到“\0”。。这永远不会发生,因为在复制第一个字符时“\0”已消失。来自strcat(3)手册页: 说明 strcat()和strncat()函数附加一个以null结尾的副本 将字符串s2添加到以null结
§7.21.3.1/2
如果复制发生在重叠的对象之间,则行为未定义。
我的编译器即使只运行一次也会崩溃,如strcat(a,a)代码>将第二个参数的第一个字符复制到第一个参数末尾的“\0”上,然后复制它后面的第二个参数的第二个字符,依此类推,直到它在第二个参数中遇到“\0”。。这永远不会发生,因为在复制第一个字符时“\0”已消失。来自strcat(3)手册页:
说明
strcat()和strncat()函数附加一个以null结尾的副本
将字符串s2添加到以null结尾的字符串s1的末尾,然后添加一个termi-
nating'\0'。字符串s1必须有足够的空间容纳
结果。
strncat()函数从s2中追加不超过n个字符,并且
然后添加终止的
\0'
源字符串和目标字符串不应重叠,因为其行为是
未定义。
这是未定义的行为
如果在循环中,从字符串中读取每个char
,直到找到\0
,但同时在其末尾追加(写入)字符,循环何时结束?我怀疑这是因为实现正在覆盖末尾的空字节:
#include <stdio.h>
int main(void)
{
char a[100] = "hi";
strcat(a, a);
strcat(a, a);
printf("%s\n", a);
return 0;
}
因为您重写了null终止符,所以您的源字符串永远不会结束,并且该方法将继续复制,直到它尝试访问不应该访问的内存和segfaults。代码审阅严格针对工作代码。我已经把你的问题转移到了我们的姐妹网站,在那里它是关于这个主题的。
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}
...