为什么此代码会产生运行时问题:
char stuff[100];
strcat(stuff,"hi ");
strcat(stuff,"there");
Run Code Online (Sandbox Code Playgroud)
但这不是吗?
char stuff[100];
strcpy(stuff,"hi ");
strcat(stuff,"there");
Run Code Online (Sandbox Code Playgroud)
Tim*_*Tim 34
strcat 将查找null-terminator,将其解释为字符串的结尾,并在其中附加新文本,覆盖进程中的null-terminator,并在连接结束时写入新的null-terminator.
char stuff[100]; // 'stuff' is uninitialized
Run Code Online (Sandbox Code Playgroud)
空终止符在哪里? stuff是未初始化的,所以它可能从NUL开始,或者它可能没有NUL在其中任何地方.
在C++中,您可以这样做:
char stuff[100] = {}; // 'stuff' is initialized to all zeroes
Run Code Online (Sandbox Code Playgroud)
现在你可以做strcat,因为'stuff'的第一个字符是null-terminator,所以它会附加到正确的位置.
在C中,你仍然需要初始化'stuff',这可以通过以下两种方式完成:
char stuff[100]; // not initialized
stuff[0] = '\0'; // first character is now the null terminator,
// so 'stuff' is effectively ""
strcpy(stuff, "hi "); // this initializes 'stuff' if it's not already.
Run Code Online (Sandbox Code Playgroud)
在第一种情况下,stuff包含垃圾. strcat要求目标和源都包含正确的以null结尾的字符串.
strcat(stuff, "hi ");
Run Code Online (Sandbox Code Playgroud)
将扫描stuff终止'\0'字符,它将开始复制"hi ".如果它没有找到它,它将从数组的末尾运行,并且可能发生任意不好的事情(即,行为是未定义的).
避免这个问题的一种方法是这样的:
char stuff[100];
stuff[0] = '\0'; /* ensures stuff contains a valid string */
strcat(stuff, "hi ");
strcat(stuff, "there");
Run Code Online (Sandbox Code Playgroud)
或者您可以初始化stuff为空字符串:
char stuff[100] = "";
Run Code Online (Sandbox Code Playgroud)
这将填充所有100个字节的stuff零(增加的清晰度可能值得任何小的性能问题).