为什么dest数组在c中的strcat需要这么多空间

时间:2019-05-02 17:51:27

标签: c

我的代码如下:

int main(){
  char str[10];
  char test[2]={'a','b'};
  strcat(str,test);
  printf("%s\n",str);
  return 0;
}

如果我将str [3]设置为str [10],则程序将损坏。为什么str []需要这么多空格,尽管我只能复制2个字母。

1 个答案:

答案 0 :(得分:1)

在您的程序中,strcat()首先查看str [10],然后向前扫描以查找字符串结尾字符(NUL /零)。找到该字符串后,它将开始复制test []中的字符串,直到该字符串末尾的NUL。

你想要的是这个

str[10] = [NUL,?,?,?,?,?,?,?,?,?]
test[3] = [a,b,NUL]

但是您实际拥有的是这个

str[10] = [?,?,?,?,?,?,?,?,?,?,?,?,?,?,...]
test[2] = [a,b,?,?,?,?,...]

Strcat将一直复制直到找到零为止,该零可能是数组末尾的数千个字节。您可能会遇到段故障,或覆盖随机数据。 Strcat对您的阵列大小一无所知。

字符串“ ab”需要一个长度为[3]的数组,因为它还包含一个NUL字符,因此您的测试声明太小。

在C中,带引号的字符串自动在末尾包含NUL,但数组不包含。您想要的是这样的:

char str[10] = {'\0','\0','\0','\0','\0','\0','\0','\0','\0','\0'};
char test[3] = {'a','b','\0'};

或者,您可以这样写:

char str[10] = "";
char test[3] = "ab";