Malloc在C中的二维数组

每次我为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

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

arr是指向int[M]指针。

使用像arr[0][M-1];

并且free(arr);

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

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

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

你有一个“指针指针”。 这不能代表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 array指针 。 类型是`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);