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

C语言指针数组调用realloc失败第五次迭代崩溃问题求助

问题原因
  • 核心错误是realloc传入的内存大小计算错误:realloc第二个参数要求的是总字节数,但你的代码直接传入了元素个数++size,没有乘以单个指针元素的占用字节数。
  • 崩溃触发时机的逻辑:32位系统下指针大小为4字节,64位下为8字节。以32位环境为例,前4次迭代分别申请1、2、3、4字节的内存,前3次分配的内存都小于指针的4字节大小,写入指针时会越界破坏堆区的管理元数据,等到第5次调用realloc时,堆管理器检测到元数据被损坏,就抛出invalid next size错误。
修复方案

把realloc调用行修改为计算总字节数即可:

data = realloc(data, ++size * sizeof(*data));

建议补充异常判断和内存释放逻辑,避免空指针解引用和内存泄漏,完整修复代码如下:

#include <stdlib.h>
#include <stdio.h>

int main() {
    int **data = NULL;
    size_t size = 0;

    for (size_t i = 0; i < 10; ++i) {
        printf("begin iteration #%lu...\n", i + 1);
        int *a = malloc(sizeof *a);
        if (!a) {
            perror("malloc failed");
            break;
        }
        // 临时变量接收realloc返回值,避免分配失败时原指针被覆盖导致泄漏
        int **temp = realloc(data, (size + 1) * sizeof(*data));
        if (!temp) {
            perror("realloc failed");
            free(a);
            break;
        }
        data = temp;
        size++;
        data[size - 1] = a;
    }

    // 释放已申请的内存
    for (size_t i = 0; i < size; ++i) {
        free(data[i]);
    }
    free(data);
    return 0;
}
补充说明
  • 计算内存大小使用sizeof(*data)而非硬编码sizeof(int*)的写法兼容性更好,后续如果修改data的指针类型,不需要同步修改分配大小的计算逻辑。

内容的提问来源于stack exchange,提问作者octowaddle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 01:45:03