C语言读取文件存入int数组后部分整数值异常变更是什么原因
问题根因
- 核心错误是堆内存分配不足:
malloc函数的入参是需要申请的内存字节数,你当前的写法malloc(numRequests[i] + 1)仅申请了numRequests[i]+1字节的内存,而你要存储的是int类型数据,多数平台下每个int占4字节,这就导致实际分配到的内存远小于存储numRequests[i]个int所需的空间。后续写入数据时发生堆内存越界,后面行的写入操作会覆盖前面行已经写入的数据,这就是两次打印结果不一致的根本原因。 - 多余的
fgets调用:fscanf读取%d格式时会自动跳过所有空白字符(包括空格、换行符、制表符),读取完一行最后一个数字后,下一次fscanf会自动跳到下一行的有效数据位置,你额外添加的fgets调用没有必要,反而可能因为行尾多余空格、换行处理不当引入额外问题。
修正方案
- 修改内存分配逻辑,申请内存时乘以
sizeof(int),确保分配足够存储所有int数据:
// 原错误写法 // philRequests[i] = (int *)malloc(numRequests[i] + 1); // 修正后写法 philRequests[i] = (int *)malloc( (numRequests[i] + 1) * sizeof(int) );
- 移除多余的
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
相关产品推荐
相关产品推荐

