提问人:Lightning 提问时间:8/7/2023 更新时间:8/7/2023 访问量:105
C++ : 取消引用空指针警告
C++ : dereferencing NULL pointer warning
问:
我试图以初学者的身份重新创建 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' ”
答:
2赞
selbie
8/7/2023
#1
如果为 nullptr,则不会提前从函数中止。这就是您收到编译器警告的原因。如果被调用,你肯定会崩溃。尽管正如其他人所说,实际的 strcat 可能不会检查任何一个指针参数是否为 null。dest
strCat(nullptr, "foo")
更多专业提示:
无需调用 strLen。尤其是对于.只要指向 null 字符,就可以退出复制循环。
src
src
STRCAT有望回归
dest
很简单,我们可以这样做:
char* strCat(char* dest, const char* src) {
char* result = dest;
// validate parameters
if ((dest == nullptr) || (src == nullptr)) {
return result;
}
// advance dest to the existing null char
while (*dest != '\0') {
dest++;
}
// copy loop
while (*src != '\0') {
*dest = *src;
dest++;
src++;
}
// make dest null terminated
*dest = '\0';
return result;
}
评论
0赞
tbxfreeware
8/7/2023
早在我第一次阅读K&R时,我还记得我第一次理解时的喜悦。然而,解释起来有点棘手,所以我向你致敬,不要在这里使用它。(后增量首先绑定到 ,但随后返回 的未递增值 ,可以取消引用该值以创建左值,等等)@Lightning:看看吧。这是一个经典的成语。*dest++ = *src++;
dest
dest
C/C++
0赞
user4581301
8/7/2023
如今,对过于局促的代码的需求不大。编译器很聪明,如果你问它,几乎可以肯定地将这个冗长且极易读的函数简化为你需要编写的那种抖动,以从古董工具中获取最佳性能。
评论
dest[i] = src[j];
-- 当是和不是时会发生什么?dest
nullptr
src
nullptr
strcat
null
strLen
src
char *