C中的Char数组是否用strncat()覆盖?

时间:2013-10-04 16:42:34

标签: c arrays concatenation overwrite strcat

这太奇怪了。看来,根据我首先声明/初始化的char数组,当我在C中的另一个数组上执行strncat()时,会覆盖一个空数组。 代码:

    char t_str[]="";
    char ran_str[]="";
    ... inbuf ="8889  ";
    while (inbuf[pos]!=' ')
    {
       strncat(t_str, &inbuf[pos],1);
       printf("t_str so far: %s\n", t_str);
       printf("ran_str so far: %s\n", ran_str);
       pos++;
    }

输出:

   t_str so far: 8
   ran_str so far:
   t_str so far: 88
   ran_str so far: 8
   t_str so far: 888
   ran_str so far: 88
   t_str so far: 8889
   ran_str so far: 889

如果我在ran_str之前初始化t_str,则ran_str[]未填满,因为我是strncat() t_str。有什么理由可能会发生这种情况?

3 个答案:

答案 0 :(得分:2)

这是因为几个问题:

  1. t_str(和ran_str)只有1个字节长。 (空终结符)
  2. inbuf中没有空格,因此循环永不结束。
  3. 因为ran_strt_str之后立即声明它在内存之后,所以当strncat溢出t_str缓冲区时它会写入ran_str

    您需要为t_str(可能还有ran_str)分配更多内存,并检查您是否没有溢出它们。您还需要通过检查是否未到达空终止符来确保您没有读过inbuf的末尾。

答案 1 :(得分:1)

Culprit是您定义数组的代码:

char t_str[]="";
char ran_str[]="";

你应该为两个数组提供一个长度。在上面的例子中,我认为t_strran_str都会得到相邻的地址。您可以尝试此确认:

printf("%p %p\n", t_str, ran_str);

使用一定长度的数组修复它:

char t_str[10]="";
char ran_str[10]="";

答案 2 :(得分:0)

当你这样做时:

char t_str[] = "";

数组只包含1个字符,足以容纳尾随空字节。然后当你这样做:

strncat(t_str, &inbuf[pos], 1);

它将一个字符复制到t_str(覆盖空值),然后一个空字节附加到它。这意味着它在数组范围之外写入,这是未定义的行为。在您的实现中,它似乎覆盖了ran_str的开头。

strncat的第三个参数应始终比目标数组中剩余的空间少1,以便为将要追加的空值留出空间。所以它应该是:

strncat(t_str, &inbuf[pos], sizeof(t_str)-strlen(t_str)-1);