我的代码如下:
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个字母。
答案 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";