有人可以告诉我这段代码有什么问题吗?
char sms[] = "gr8";
strcat (sms, " & :)");
答案 0 :(得分:14)
sms
是一个大小为4
1 的数组。并且你要追加更多的字符文字,这些文字会出现在数组之外,因为数组可以容纳已被4
占用的最大g, r, 8, \0
个字符。
1。顺便问一下,为什么4呢?答:因为最后有一个空字符!功能
如果你提到如下所示的数组大小,那么你的代码是有效且定义明确的。
char sms[10] = "gr8"; //ensure that size of the array is 10
//so it can be appended few chars later.
strcat (sms, " & :)");
但是C ++为您提供了更好的解决方案:使用std::string
作为:
#include <string> //must
std::string sms = "gr8";
sms += " & :)"; //string concatenation - easy and cute!
答案 1 :(得分:8)
是的,额外的角色没有空间。 sms[]
仅分配足够的空间来存储初始化的字符串。
使用C ++,更好的解决方案是:
std::string sms = "gr8";
sms += " & :)";
答案 2 :(得分:4)
您正在将数据复制到未分配的内存中。
执行此操作时:char sms[] = "gr8";
创建一个包含4个字符的字符数组,“gr8”加上字符串末尾的0字符。
然后尝试使用strcat
调用将额外字符复制到数组中,超出数组末尾。这会导致未定义的行为,这意味着会发生不可预测的事情(程序可能会崩溃,或者您可能会看到奇怪的输出)。
要解决此问题,请确保将要复制字符的数组足够大以包含所有字符,并且不要忘记最后的0字符。
答案 3 :(得分:2)
在C中,数组不会自动增长。
sms
具有特定长度(在这种情况下为4,三个字母和终止NULL)。当你调用strcat
时,你试图将字符附加到超过其长度的数组。
这是未定义的行为,会破坏您的程序。
如果您已经分配了一个足够大的数组来包含两个字符串,那么你可以:
char sms[9] = "gr8";
strcat (sms, " & :)");
C ++对C的数组(基本上)有相同的限制。但是,它提供了更高级别的工具,因此您不必在很多时候处理数组,例如std::string
:
#include <string>
// ...
std::string sms = "gr8";
sms += " & :)";
这个更好的原因是你不必提前知道你的字符串有多长。 C ++将为您增加内存中的底层存储。
答案 4 :(得分:1)
缓冲区溢出,然后在某处崩溃!
答案 5 :(得分:1)
你的短信缓冲区长度只有4个字符。 strcat将在其末尾复制5个以上的字符并破坏堆栈。