新手重写strcat函数遇Visual Studio 2022解引用NULL指针警告
解决Visual Studio中strcat实现的空指针解引用警告
你的代码里编译器检测到当dest为nullptr时,循环里依然会尝试访问dest[i],这就是警告的来源。虽然你判断了dest不为nullptr时才计算destLen,但如果dest是nullptr,destLen会保持0,后续的循环还是会执行(i从0开始到srcLen),这时候解引用空指针是未定义行为,VS的静态代码分析提前捕捉到了这个风险。
修正方案:
- 开头先检查dest是否为nullptr,是的话直接返回——目标指针无效时根本无法完成追加操作。
- 统一变量类型,把j改成size_t,避免和i的类型不匹配。
- 简化逻辑,确保只有在dest和src都有效的情况下才执行复制。
修正后的代码:
void strCat(char* dest, const char* src) { // 先校验两个指针有效性,任一为空直接返回 if (dest == nullptr || src == nullptr) { return; } size_t destLen = 0; // 手动计算目标字符串长度(避免依赖自定义的strLen) while (dest[destLen] != '\0') { destLen++; } size_t j = 0; // 追加src内容,包括终止符 while (src[j] != '\0') { dest[destLen + j] = src[j]; j++; } // 确保字符串末尾的终止符(src的终止符已被复制,此处可省略,写出来更严谨) dest[destLen + j] = '\0'; }
关键说明:
- 标准库
strcat要求dest必须是指向足够大的可修改内存的有效指针,不能为nullptr,所以开头直接判断dest为空就返回是符合逻辑的。 - 用while循环计算长度比调用自定义strLen更直观,也避免了额外函数调用的潜在问题。
- 复制时直接用
dest[destLen + j]定位到dest末尾,逻辑更清晰易懂。
内容的提问来源于stack exchange,提问作者Lightning
相关产品推荐
相关产品推荐

