Malloc是C中的2D数组

时间:2016-04-27 13:01:03

标签: c arrays malloc

每次我为2D数组分配内存时,我首先创建一个int**数组,然后使用for我为每个元素分配内存。

例如:

int ** arr = malloc(N*sizeof(int *));
for(i=0; i< N; i++) arr[i] = malloc(M*sizeof(int));

无法分配内存,如:

int ** arr = malloc(N*sizeof(int[M]));

int ** arr = malloc(sizeof(int[N][M]));

为了避免for

3 个答案:

答案 0 :(得分:10)

int ** arr = malloc(N*sizeof(int[M]));只是不正确的C代码,如果你通过像这样分配一次来模拟它:

int *arr = malloc(N*M*sizeof(int));

通过arr[i*M + j]添加访问权限,这类似于您在第一种情况下访问arr[I][j]

答案 1 :(得分:8)

像这样:int (*arr)[M] = malloc(sizeof(int[N][M]));

arrint[M]的指针。

arr[0][M-1];

一样使用

free(arr);

答案 2 :(得分:3)

你有一个“指针指针”。这不能代表2D数组。

指向2D数组的指针的正确声明是

// number of elements in one row
#define COLS 10

// number of rows
#define ROWS 20

int (*array)[COLS];   // mind the parenthesis!

这使得array指向COLS int s 数组的指针。类型是`int(*)[COLS],顺便说一句。但你不需要这种类型,见下文。

要分配数组,您应该使用1D数组的标准分配:

array = malloc(sizeof(*array) * ROWS);   // COLS is in the `sizeof`

array = malloc(sizeof(int[ROWS][COLS])); // explicit 2D array notation

使用哪种变体是个人风格。虽然第一个不包含冗余(考虑将array的声明更改为使用INNER而不是COLS或将元素类型更改为float)。第二眼更加清晰,但在修改array的声明时更容易出错。

free

free(array);