C语言温度逆序输出作业禁用realloc时出现malloc堆损坏错误求解
报错原因分析
你遇到的malloc(): corrupted top size错误核心原因是堆内存越界写入,破坏了malloc库维护的堆块元数据,触发了内存检测机制直接崩溃。具体问题点如下:
- 数组越界写入是直接诱因
初始数组分配了size=5个float元素,合法下标范围是0~4,但你内层循环的判断条件是count<=size,当count等于5时仍然会执行写入操作,访问temperature_first[5],该地址已经超出了你申请的堆内存范围,直接修改了malloc分配的相邻堆块的控制元数据,后续再调用malloc时检测到元数据被篡改就会报错。 - 变量未初始化存在逻辑隐患
inputArray定义时没有赋初始值,第一次进入外层while循环判断inputArray !=-100时读取的是栈上的随机值,可能出现预期外的循环行为。 - 数组元素拷贝逻辑错误
扩容时你已经将size乘以2,此时size/2是旧数组的大小,你拷贝时用elements<(size/2)+1,如果旧数组已经被完全填满,拷贝时会多访问旧数组的越界地址,同样会触发内存非法访问。另外你应该拷贝的是已经输入的count个有效元素,而非固定按旧数组大小拷贝,否则未填满旧数组就结束输入时会拷贝大量无效垃圾值。 - 输入结束标记处理逻辑缺陷
你输入-100后仍然执行了count++,导致统计的输入数量多了1,虽然当前输出逻辑用count-2暂时规避了问题,但属于逻辑隐患。
可选优化:你不需要维护两个指针来回切换,只需要一个
float *temps指针即可,扩容时申请新指针,拷贝完数据释放旧指针后直接把新指针赋值给temps即可,代码会简洁很多,也不容易出错。
内容的提问来源于stack exchange,提问作者DD Confederacy
相关产品推荐
相关产品推荐

