将字符串与自身连接两次会导致分段错误 #包括 内部主(空) { 字符a[100]=“hi”; strcat(a,a); strcat(a,a); printf(“%s\n”,a); 返回0; }

将字符串与自身连接两次会导致分段错误 #包括 内部主(空) { 字符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结

根据C语言标准中strcat的定义,
§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}
...