C++使用fopen写数组到二进制文件报malloc(): corrupted top size错误
根因分析
内存分配不足导致堆缓冲区溢出,破坏了malloc的内存管理元数据,最终触发SIGABRT信号报错。
在userChoice函数中,你定义合并后数组长度为mergedLength = 2 * length,但为mergedArray分配内存时仅申请了length个int大小的空间:
// 错误:仅分配了length个int的空间,实际需要2*length个 int *mergedArray = (int *) malloc(length * sizeof (int)); // 越界写入:向只有length长度的数组写入mergedLength=2*length个元素 initializeArray(mergedArray, mergedLength);
越界写入直接覆盖了堆顶部的malloc控制结构,因此触发malloc(): corrupted top size错误。
修复方法
修改mergedArray的内存分配逻辑,申请足够容纳2倍长度的空间即可:
int *mergedArray = (int *) malloc(mergedLength * sizeof (int));
可选优化项
- 当前所有菜单选项都会提前分配
secondArray和mergedArray内存,仅FOUR选项会用到,可将这两块内存的分配、释放逻辑移到case FOUR分支内部,减少不必要的内存开销。 - C++程序优先使用
new/delete替代malloc/free,或直接使用std::vector容器,降低手动内存管理带来的越界、泄漏风险。 case ONE分支中givenNumber未初始化就传入serialSearch,虽函数内部会重新读取赋值,但存在规范隐患,建议初始化变量。
内容的提问来源于stack exchange,提问作者Feanor Nosselo
相关产品推荐
相关产品推荐

