我尝试以初学者的身份重新创建 strcat 函数, 警告显示在行上:
dest[i] = src[j];
void strCat(char* dest, const char* src) {
size_t len = 0, destLen = 0, srcLen = 0;
if (dest != nullptr) { destLen = strLen(dest);}
if (src == nullptr) { return; }
else { srcLen = strLen(src); }
int j = 0;
len = destLen + srcLen +1;
for (size_t i = destLen; i < len; ++i)
{
dest[i] = src[j];
j++;
}
}
我在 Visual Studio 2022 中遇到此警告,代码已成功执行,并且警告未显示在输出窗口或错误列表中。但在代码窗口中,它下划线并显示“取消引用 NULL 指针 'dest'”
如果
dest
为 nullptr,则不会提前从函数中中止。这就是为什么你会收到编译器警告。如果调用 strCat(nullptr, "foo")
你肯定会崩溃。尽管正如其他人所说,实际的 strcat 可能不会检查任一指针是否为空。
更多专业提示:
您不需要调用strLen。尤其不适合
src
。一旦 src
指向空字符,您就可以退出复制循环。
复制循环结束后,您忘记了空终止
dest
。这是需要解决的更大错误。
strCat预计回归
dest
我们可以很简单地做到这一点:
char* strCat(char* dest, const char* src) {
char* result = dest;
// optional parameter check to make the compiler happy
if ((dest == nullptr) || (src == nullptr)) {
return result;
}
// advance dest on the existing null char
while (*dest != '\0') {
dest++;
}
// copy loop
while (*src != '\0') {
*dest = *src;
dest++;
src++;
}
// make sure last char in dest is null
*dest = '\0';
return result;
}