尝试初始化二维数组时出现分段错误

问题描述 投票:0回答:1

我不知道这里出了什么问题,当我尝试运行这段代码时出现段错误:

#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][j] = 0;
        }
        return (grid);
    }

应该用 0 初始化二维数组

arrays c segmentation-fault dynamic-memory-allocation
1个回答
2
投票

问题是你实际上分配了一个一维数组

grid = malloc(sizeof(int) * (width * height));

所以取消引用指针

grid
喜欢

grid[i]

您正试图将未初始化的分配内存读取为导致未定义行为的地址值。

您需要分配一个指针数组来模拟二维数组,例如

#include <string.h>
#include <stdlib.h>

//...

grid = malloc(sizeof(int *) * height);

for ( int i = 0; i < height; i++ )
{
    grid[i] = malloc( sizeof( int ) * width );
}

for ( int i = 0; i < height; i++ )
{
    memset( grid[i], 0, sizeof( int ) * width );
}

或者你可以像你已经做的那样分配一个一维数组,但只使用一个下标运算符。在这种情况下,指针

grid
的类型应为
int *
并且函数将声明为

int * alloc_grid(int width, int height);

例如

#include <string.h>
#include <stdlib.h>

//...

int *grid;
//...
grid = malloc( sizeof(int) * width * height );
memset( grid, 0, sizeof( int ) * height * width );

或者不是调用函数

memset
,您可以使用
calloc
而不是
malloc
最初将数组初始化为零,例如

grid = malloc(sizeof(int *) * height);

for ( int i = 0; i < height; i++ )
{
    grid[i] = calloc( width, sizeof( int ) );
}

grid = calloc( width * height, sizeof(int) );
© www.soinside.com 2019 - 2024. All rights reserved.