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

初始化二维数组时触发Segmentation fault(段错误)问题求助

代码段错误原因及修复方案

核心问题

  • 类型不匹配:int **grid是指向指针的指针,用于表示指针数组形式的二维数组,但你用malloc(sizeof(int) * width * height)分配的是一块连续的int类型内存,两者类型完全不兼容。当执行grid[i][j]时,grid[i]会被当作指针地址去解引用,但实际grid存储的是int数值,并非有效内存地址,直接触发非法内存访问,导致段错误。
  • 二维数组实现混淆:代码错误混合了「指针数组式二维数组」和「连续内存模拟二维数组」两种实现逻辑,导致内存访问方式与实际分配的内存结构不匹配。

修复方案

有两种标准的修复方式,可根据需求选择:

方式1:指针数组实现真正的二维数组

这种方式下,每一行是独立的一维数组,符合int **的类型定义:

#include <stdlib.h>

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

    if (width < 1 || height < 1)
        return NULL;

    // 先分配存储行指针的数组
    grid = malloc(sizeof(int *) * height);
    if (grid == NULL)
        return NULL;

    // 为每一行分配内存并初始化
    for (i = 0; i < height; i++)
    {
        grid[i] = malloc(sizeof(int) * width);
        if (grid[i] == NULL)
        {
            // 分配失败时回滚已分配内存,避免泄漏
            while (i-- > 0)
                free(grid[i]);
            free(grid);
            return NULL;
        }
        for (j = 0; j < width; j++)
            grid[i][j] = 0;
    }
    return grid;
}

方式2:连续内存模拟二维数组

如果想使用一块连续内存,需修改返回类型为int *,手动计算索引:

#include <stdlib.h>

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

    if (width < 1 || height < 1)
        return NULL;

    grid = malloc(sizeof(int) * width * height);
    if (grid == NULL)
        return NULL;

    // 通过一维索引模拟二维访问
    for (i = 0; i < height; i++)
    {
        for (j = 0; j < width; j++)
            grid[i * width + j] = 0;
    }
    return grid;
}

额外注意事项

  • 方式1中必须处理部分分配失败的情况,释放已分配的内存,避免内存泄漏;
  • 原代码的参数合法性检查逻辑是正确的,无需修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 22:12:12