使用realloc为数组扩容时出现realloc invalid next size错误如何解决
问题原因
- 扩容大小计算错误:当前代码在插入第
numberOfElements个元素时,仅将数组扩容到numberOfElements个int的大小,数组最大合法下标是numberOfElements - 1,后续直接写入bubbleSortArray[numberOfElements]属于堆内存越界,会破坏堆块的元数据,触发invalid next size报错。 - 循环边界错误:要存入100000个数字,循环条件应为
j < 100000,当前j <= 100000会多执行1次循环,最终多存1个超出预期的元素。 - 不规范的realloc用法:直接将
realloc的返回值赋值给原数组指针,如果realloc申请内存失败返回NULL,会导致原数组的内存地址丢失,引发内存泄漏。
修复后的代码
#include <stdio.h> #include <stdlib.h> #include <time.h> int main() { printf("starting\n"); int *bubbleSortArray = (int *)malloc(sizeof(int)); if (bubbleSortArray == NULL) { perror("初始malloc失败"); return 1; } int numberOfElements = 0; int randomNumber; srand(time(NULL)); for (int j = 0; j < 100000; j++) { randomNumber = rand(); if(numberOfElements != 0) { // 用临时指针接收realloc返回值,避免内存泄漏 int *temp = (int *) realloc(bubbleSortArray, (numberOfElements + 1) * sizeof(int)); if (temp == NULL) { perror("realloc扩容失败"); free(bubbleSortArray); return 1; } bubbleSortArray = temp; } bubbleSortArray[numberOfElements] = randomNumber; numberOfElements = numberOfElements + 1; } printf("成功存入%d个随机数\n", numberOfElements); // 释放堆内存避免泄漏 free(bubbleSortArray); return 0; }
修复说明
- 扩容时将大小调整为
(numberOfElements + 1) * sizeof(int),保证数组有足够空间存储新元素 - 修正循环条件为
j < 100000,刚好生成100000个随机数 - 用临时指针接收
realloc返回值,判断非空后再赋值给原数组指针,避免内存泄漏 - 补充了内存申请失败的异常处理逻辑和程序结束前的内存释放逻辑
内容的提问来源于stack exchange,提问作者lizardcoder
相关产品推荐
相关产品推荐

