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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 15:06:04