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

问题描述 投票:0回答:1

我尝试以初学者的身份重新创建 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++ pointers reference null
1个回答
0
投票

如果

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.