C语言for循环中校验malloc返回值及堆缓冲区溢出错误解决
malloc返回值校验逻辑说明
你编写的for循环内校验malloc返回值的逻辑本身是完全正确的,是C语言中内存分配校验的标准写法:在每次malloc调用后立刻判断返回值是否为NULL,若为NULL则报错退出,避免后续访问空指针。
如果学校编译器对这段代码报错,大概率是编译器使用的C标准版本过低导致:C89标准不允许在for循环的括号内定义变量int i,你只需要将i的定义移动到代码块的最开头即可解决。
AddressSanitizer堆溢出问题修复
你遇到的heap-buffer-overflow报错是字符串拷贝时缓冲区长度不足导致的越界写入,结合代码和错误日志有两个明确问题:
- 内存分配长度未预留字符串结束符空间
C语言的字符串以\0作为结束标记,分配存储字符串的内存时,需要在可见字符长度的基础上多分配1字节存储\0。你代码中硬编码的分配长度10/14都没有正确匹配目标字符串的总长度,导致strcpy写入时越界。
推荐的安全写法是不要硬编码分配长度,直接根据要存储的字符串长度计算:
ptr[i] = malloc(strlen(待存储字符串) + 1);
- 使用了未定义的
str_compare函数
C标准库不存在str_compare字符串比较函数,你需要替换为标准库的strcmp函数,否则会触发未定义行为。
内容的提问来源于stack exchange,提问作者Bohuslav Čabajka
相关产品推荐
相关产品推荐

