Valgrind报Invalid read of size 1:C读取文件打印时触发内存错误
错误原因
C语言中的字符串要求必须以'\0'(空字符)作为结束标记,你的代码存在两个相关问题直接触发了Valgrind的越界读报错:
- 内存分配时只申请了和文件大小完全相等的
f_size字节,没有预留存储'\0'结束符的额外空间 - 调用
fread读完文件内容后,没有手动给字符串末尾追加'\0'结束符
当你用printf("%s", string)打印字符串时,printf会从string指向的地址开始不断向后读取内存,直到找到'\0'才会停止,此时就会读到你申请的内存块之外的区域,正好对应Valgrind日志里的Address 0x4a4932e is 0 bytes after a block of size 142 alloc'd报错信息。
修复方案
只需要修改两处代码即可:
- 调整malloc的内存大小,多申请1字节存储结束符:
// 原代码 string = (char *)malloc(sizeof(char) * f_size); // 修改后 string = (char *)malloc(sizeof(char) * (f_size + 1));
- fread读完内容后,手动在末尾添加结束符:
fread(string, sizeof(char), f_size, fp); // 新增以下一行 string[f_size] = '\0';
额外补充:标准C的fopen没有"rw+"这个打开模式,如果需要读写打开已存在的文件建议用"r+",避免部分系统兼容性问题。
内容的提问来源于stack exchange,提问作者TheDayAfterDark
相关产品推荐
相关产品推荐

