每次我为2D数组分配内存时,我首先创建一个数组,int**然后使用for我为每个元素分配内存.
例如:
int ** arr = malloc(N*sizeof(int *));
for(i=0; i< N; i++) arr[i] = malloc(M*sizeof(int));
Run Code Online (Sandbox Code Playgroud)
不可能像以下那样分配内存:
int ** arr = malloc(N*sizeof(int[M]));
Run Code Online (Sandbox Code Playgroud)
要么
int ** arr = malloc(sizeof(int[N][M]));
Run Code Online (Sandbox Code Playgroud)
为了避免for?
flu*_*ter 10
int ** arr = malloc(N*sizeof(int[M])); 只是不正确的C代码,如果你通过像这样分配一次来模拟它:
int *arr = malloc(N*M*sizeof(int));
Run Code Online (Sandbox Code Playgroud)
添加访问权限arr[i*M + j],这类似于arr[I][j]第一种情况下的访问.
像这样 : int (*arr)[M] = malloc(sizeof(int[N][M]));
arr是指针int[M].
用得像 arr[0][M-1];
和 free(arr);
你有一个“指向指针的指针”。那不能代表二维数组。
指向二维数组的指针的正确声明是
// number of elements in one row
#define COLS 10
// number of rows
#define ROWS 20
int (*array)[COLS]; // mind the parenthesis!
Run Code Online (Sandbox Code Playgroud)
这使得array一个指向COLS ints数组的指针。类型是`int (*)[COLS],顺便说一句。但你不需要类型,见下文。
要分配数组,您应该使用一维数组的标准分配:
array = malloc(sizeof(*array) * ROWS); // COLS is in the `sizeof`
array = malloc(sizeof(int[ROWS][COLS])); // explicit 2D array notation
Run Code Online (Sandbox Code Playgroud)
使用哪种变体是个人风格。虽然第一个不包含冗余(考虑将 的声明更改array为 useINNER而不是COLS或将元素类型更改为float)。第二个一目了然,但在修改array.
至free:
free(array);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11848 次 |
| 最近记录: |