将字符串与自身连接两次会产生分段错误

时间:2011-11-22 18:08:09

标签: c string

#include <stdio.h>

int main(void)
{
    char a[100] = "hi";

    strcat(a, a);
    strcat(a, a);

    printf("%s\n", a);

    return 0;
}

4 个答案:

答案 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终止符,你的源字符串将永远不会结束,并且该方法将继续复制,直到它尝试访问它不应该访问的内存和段错误。