我知道已经发布了一些关于使用malloc的2d数组的问题,但是,我想参考其中一个问题的答案。
我无法想象以下片段的实现:
分配一个由M行N列组成的数组,如下所示:
int (*array)[N] = malloc(M * sizeof *array);
- 如果我们有M行,为什么
*array
有N个参数 *array
(也称为数字(的大小是多少?我只将malloc((部分的结果理解为M*N,而是结构的单个块(1d(- 仅在malloc中传递的M大小是如何变成行数的?它是如何变成
*array[M][N]
的
我很感激你的回答。
如果我们有M行,为什么*数组有N个参数
仅在malloc中传递的M大小如何变成行数?
问题中的代码是编写表达式的最正确方法的简化版本:
int (*array)[M][N] = malloc(sizeof *array);
然而,这种形式使用起来有问题,因为现在我们必须以(*array)[i][j]
的形式访问数组,这既奇怪又麻烦。
因此,有一个技巧可以省去最左边的维度,而是使用指向第一个元素的指针。int [M][N]
的第一个元素是int [N]
,并且指向这种元素的指针是int(*)[N]
。
使用int (*array)[N]
,我们可以访问作为array[i][j]
的数组,其中[i]
是int(*)[N]
类型上的指针算术,而[j]
是int*
(衰减的int [N]
数组(上的指针算法。
*阵列的大小是多少
它是sizeof(int [N])
字节,或者如果要sizeof(int)*N
字节。
更多细节可以在这里找到:正确分配多维数组