C语言VS2022预览版拼接字符串报buffer overrun错误原因求解
问题原因
- 核心错误是字符串长度统计的循环条件写错:你用来统计
first和second长度的for循环中,判断条件写为first[i] < '\0'、second[i] < '\0'。C语言中'\0'的ASCII码值为0,常规字符串中的可打印字符ASCII码均为非负值,这个判断条件永远不成立,导致nprime、nsecond两个长度变量的统计结果始终为0。 - 编译器的静态分析识别到你计算出的长度和实际要写入的字符串长度不匹配,判定后续写入操作会超过
malloc分配的内存空间,因此抛出buffer overrun警告。你修改malloc分配大小的操作没有解决根因,所以警告仍然存在。
修复方案
- 第一步:修正两个长度统计的循环条件,将
< '\0'改为!= '\0',正确统计两个输入字符串的实际长度:
// 修正统计first长度的循环 for (size_t i = 0; first[i] != '\0'; i++) { nprime++; } // 修正统计second长度的循环 for (size_t i = 0; second[i] != '\0'; i++) { nsecond++; }
- 可选优化:如果不需要手动实现长度统计,可以直接使用标准库函数
strlen来获取字符串长度,减少手写逻辑出错的概率,使用时需要引入头文件#include <string.h>。 - 修复后完整的
link函数代码如下:
#include <stdlib.h> // 若使用strlen则引入#include <string.h> char* link( const char* first, const char* second) { size_t nprime = 0; size_t nsecond = 0; if (first == NULL || second == NULL) { return NULL; } // 修正后的长度统计逻辑 for (size_t i = 0; first[i] != '\0'; i++) { nprime++; } for (size_t i = 0; second[i] != '\0'; i++) { nsecond++; } char* result = malloc(nprime + nsecond + 1); if (result == NULL) { return NULL; } for (size_t i = 0; i < nprime; i++) { result[i] = first[i]; } for (size_t i = 0; i < nsecond; i++) { result[nprime + i] = second[i]; } result[nprime + nsecond] = '\0'; return result; }
- 额外注意:主函数中调用
link得到的堆内存需要手动调用free释放,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Gabriel Burzacchini
相关产品推荐
相关产品推荐

