C++ : 取消引用空指针警告

C++ : dereferencing NULL pointer warning

提问人:Lightning 提问时间:8/7/2023 更新时间:8/7/2023 访问量:105

问:

我试图以初学者的身份重新创建 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' ”

C++ 指针 引用 null

评论

2赞 PaulMcKenzie 8/7/2023
dest[i] = src[j];-- 当是和不是时会发生什么?destnullptrsrcnullptr
3赞 PaulMcKenzie 8/7/2023
我试图以初学者的身份重新创建 strcat 函数——实际函数不会对参数进行任何检查。strcatnull
1赞 Mark Saving 8/7/2023
我不知道当你说“代码”时你指的是什么代码。请告诉我们您实际执行的代码。
1赞 selbie 8/7/2023
你实际上不需要调用,你可以终止你的复制循环,并在 src[j]strLensrc
0赞 doug 8/7/2023
您的函数应返回 a 以兼容。char *

答:

2赞 selbie 8/7/2023 #1

如果为 nullptr,则不会提前从函数中止。这就是您收到编译器警告的原因。如果被调用,你肯定会崩溃。尽管正如其他人所说,实际的 strcat 可能不会检查任何一个指针参数是否为 null。deststrCat(nullptr, "foo")

更多专业提示:

  • 无需调用 strLen。尤其是对于.只要指向 null 字符,就可以退出复制循环。srcsrc

  • 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++;destdestC/C++
0赞 user4581301 8/7/2023
如今,对过于局促的代码的需求不大。编译器很聪明,如果你问它,几乎可以肯定地将这个冗长且极易读的函数简化为你需要编写的那种抖动,以从古董工具中获取最佳性能。