每次我为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
?
答案 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]));
arr
是int[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);