You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Valgrind报Invalid read of size 1:C读取文件打印时触发内存错误

错误原因

C语言中的字符串要求必须以'\0'(空字符)作为结束标记,你的代码存在两个相关问题直接触发了Valgrind的越界读报错:

  1. 内存分配时只申请了和文件大小完全相等的f_size字节,没有预留存储'\0'结束符的额外空间
  2. 调用fread读完文件内容后,没有手动给字符串末尾追加'\0'结束符

当你用printf("%s", string)打印字符串时,printf会从string指向的地址开始不断向后读取内存,直到找到'\0'才会停止,此时就会读到你申请的内存块之外的区域,正好对应Valgrind日志里的Address 0x4a4932e is 0 bytes after a block of size 142 alloc'd报错信息。

修复方案

只需要修改两处代码即可:

  1. 调整malloc的内存大小,多申请1字节存储结束符:
// 原代码
string = (char *)malloc(sizeof(char) * f_size);
// 修改后
string = (char *)malloc(sizeof(char) * (f_size + 1));
  1. fread读完内容后,手动在末尾添加结束符:
fread(string, sizeof(char), f_size, fp);
// 新增以下一行
string[f_size] = '\0';

额外补充:标准C的fopen没有"rw+"这个打开模式,如果需要读写打开已存在的文件建议用"r+",避免部分系统兼容性问题。

内容的提问来源于stack exchange,提问作者TheDayAfterDark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 07:15:03