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

C语言中为二维数组元素重新分配内存失败问题求助

问题分析与解决

核心误解:sizeof的作用

你用sizeof(resultIndexArr[0])判断扩容后的内存大小是完全错误的——sizeof是编译时运算符,它计算的是变量类型的大小,不是堆上实际分配的内存大小。在64位系统中,int*类型的大小固定为8字节,不管你用malloc/realloc给它分配多少内存,sizeof(resultIndexArr[0])永远返回8。

代码里的其他问题

  1. 初始分配类型不匹配:
    resultIndexArr是int**类型,它的每个元素是int*,所以初始分配应该用sizeof(int*)而非sizeof(int**):

    int** resultIndexArr = malloc(sizeof(int*) * 2);
    

    (64位下两者大小相同,但逻辑上必须匹配元素类型)

  2. realloc操作野指针:
    malloc后resultIndexArr[0]是未初始化的野指针,直接用realloc操作野指针属于未定义行为,会导致程序崩溃或异常。必须先把它初始化为NULL:

    resultIndexArr[0] = NULL;
    
  3. 扩容大小逻辑模糊:
    你写的sizeof(int *) +sizeof(resultIndexArr[0])等于8+8=16,但要明确自己要存的数据类型:如果是存2个int,应该写sizeof(int)*2;如果是存2个int*,则是sizeof(int*)*2。

正确写法示例

如果想让resultIndexArr[0]指向能容纳2个int的内存,且自己记录分配大小:

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

int main() {
    int** resultIndexArr = malloc(sizeof(int*) * 2);
    if (resultIndexArr == NULL) {
        return 1;
    }

    resultIndexArr[0] = NULL;
    // 分配能存2个int的内存(假设int为4字节,总大小16)
    resultIndexArr[0] = realloc(resultIndexArr[0], sizeof(int) * 2);
    if (resultIndexArr[0] == NULL) {
        free(resultIndexArr);
        return 1;
    }

    // 堆内存大小无法用sizeof获取,必须自行记录
    size_t allocated_size = sizeof(int) * 2;
    printf("实际分配的内存大小:%lu\n", allocated_size); // 输出16
    printf("指针本身的大小:%lu\n", sizeof(resultIndexArr[0])); // 输出8,属正常情况

    free(resultIndexArr[0]);
    free(resultIndexArr);
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 06:03:18