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);