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

C语言中为二维数组赋值0时出现段错误,求原因及正确索引方式

二维数组初始化段错误的原因与修复方案

你的代码存在两处关键问题,直接引发了段错误:

1. 内存分配逻辑完全错误

int** 类型代表的是指向指针数组的指针,实现二维数组需要两层内存分配:

  • 第一层:分配存储行指针的数组(比如height个int*,对应二维数组的每一行)
  • 第二层:给每个行指针分配对应列数的int内存(每个行指针指向width个int的数组)

但你直接分配了width*height个int*的内存,既浪费空间,又没有给array_pointer[i]赋值有效地址——此时array_pointer[i]是野指针,访问array_pointer[i][j]必然触发段错误。

2. 参数合法性检查顺序错误

你先执行了内存分配,再检查width和height是否合法。如果参数不合法(比如小于等于0),直接返回NULL,之前分配的内存会永久泄漏。


修正后的代码

int **alloc_grid(int width, int height)
{
    int **array_pointer;
    int i;
    int j;

    // 先做参数合法性校验,不合法直接返回
    if (width <= 0 || height <= 0)
        return NULL;

    // 分配行指针数组,共height个行指针
    array_pointer = malloc(sizeof(int *) * height);
    if (array_pointer == NULL)
        return NULL;

    // 为每个行指针分配列内存,并初始化元素为0
    for (i = 0; i < height; i++)
    {
        array_pointer[i] = malloc(sizeof(int) * width);
        // 分配失败时回滚已分配的内存,避免泄漏
        if (array_pointer[i] == NULL)
        {
            while (i > 0)
                free(array_pointer[--i]);
            free(array_pointer);
            return NULL;
        }
        // 初始化当前行的所有元素为0
        for (j = 0; j < width; j++)
            array_pointer[i][j] = 0;
    }

    return array_pointer;
}

关键修正点说明

  • 调整参数检查顺序,避免无效内存分配
  • 按二维数组的标准结构分配内存:先分行指针,再分每行的元素内存
  • 添加内存分配失败的回滚逻辑,防止内存泄漏
  • 采用行优先的索引方式(array_pointer[i][j]代表第i行第j列),符合常规二维数组的访问习惯

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 04:55:30