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

C语言读取文件存入int数组后部分整数值异常变更是什么原因

问题根因
  • 核心错误是堆内存分配不足:
    malloc函数的入参是需要申请的内存字节数,你当前的写法malloc(numRequests[i] + 1)仅申请了numRequests[i]+1字节的内存,而你要存储的是int类型数据,多数平台下每个int占4字节,这就导致实际分配到的内存远小于存储numRequests[i]个int所需的空间。后续写入数据时发生堆内存越界,后面行的写入操作会覆盖前面行已经写入的数据,这就是两次打印结果不一致的根本原因。
  • 多余的fgets调用:
    fscanf读取%d格式时会自动跳过所有空白字符(包括空格、换行符、制表符),读取完一行最后一个数字后,下一次fscanf会自动跳到下一行的有效数据位置,你额外添加的fgets调用没有必要,反而可能因为行尾多余空格、换行处理不当引入额外问题。
修正方案
  1. 修改内存分配逻辑,申请内存时乘以sizeof(int),确保分配足够存储所有int数据:
// 原错误写法
// philRequests[i] = (int *)malloc(numRequests[i] + 1);
// 修正后写法
philRequests[i] = (int *)malloc( (numRequests[i] + 1) * sizeof(int) );
  1. 移除多余的fgets调用,删除该行代码即可:
// 删除下面这行多余代码
// fgets(buff, 255, (FILE*)fp); //moves on to next line
额外注意事项
  • 确认存储姓名的names[i]数组要预留足够的空间存储字符串末尾的结束符\0,比如姓名"Joanna"共6个字符,至少需要7字节的存储空间,否则会发生栈内存越界,同样可能破坏其他变量的数据。
  • 如果你申请内存时加的+1没有特殊用途(比如存储结束标记),可以直接去掉,按实际需要numRequests[i]个int的存储空间即可。
  • 程序结束时记得调用free释放所有malloc申请的堆内存,避免内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 21:45:03