You need to enable JavaScript to run this app. C语言二维数组realloc操作触发Segmentation Fault段错误问题求解
优惠活动
大模型
产品
解决方案
定价
更多

C语言二维数组realloc操作触发Segmentation Fault段错误问题求解

问题解答

第一段代码段错误原因

C语言函数参数默认采用值传递规则,第一段代码的Append函数中,int** arr是main函数内arr变量的副本,对形参arr的赋值不会同步到main函数的原变量:

  • 第一次调用Append时count=0 < len=1,不触发扩容,直接写入arr[0],运行正常,count自增为1
  • 第二次调用Append时count=1 >= len=1,触发扩容逻辑:
    1. 执行arr = realloc(arr, *len * sizeof(int*));仅修改了函数内形参arr的地址,main函数中的原arr变量完全没有更新
    2. realloc执行时会自动释放原内存块,此时main函数中的arr变成指向已释放内存的野指针
    3. 回到main函数执行printf时,访问野指针arr[i]直接触发段错误

两段代码核心差异

第二段代码采用结构体封装+传结构体指针的方式,规避了值传递的问题:

  • 传入Append的是main函数中coordinate结构体的指针,修改array->arr时,是直接修改结构体内部存储的arr指针值,修改结果对main函数完全可见
  • 扩容后的新内存地址会同步更新到main函数使用的arr变量中,不会出现野指针问题,因此可以正常运行

无结构体的修复方案

如果不想用结构体封装,只需要把Append的第一个参数改为三级指针,传入main函数arr变量的地址即可:

// 修改后的Append函数
void Append(int ***arr, int *count, int *len, int x, int y){
    if (*count >= *len){
        *len *= 2;
        // 解引用三级指针拿到main中arr变量的地址,直接修改其值
        *arr = realloc(*arr, *len * sizeof(int*));
        for (int i=*count; i< *len; ++i){
            (*arr)[i] = malloc(sizeof(int) * 2);
        }
    }
    (*arr)[*count][0] = x;
    (*arr)[*count][1] = y;
    ++*count;
}

// 调用时传入arr的地址
Append(&arr, &count, &len, i, i);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 02:42:01