我不知道这里出了什么问题,当我尝试运行这段代码时出现段错误:
#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 初始化二维数组
问题是你实际上分配了一个一维数组
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) );