【发布时间】:2021-03-29 03:29:51
【问题描述】:
我知道已经发布了一些关于使用 malloc 的 2d 数组的问题,但是,对于其中一个问题,我想参考 answer。
我无法想象以下片段的实现:
像这样分配 M 行 N 列的数组:
int (*array)[N] = malloc(M * sizeof *array);
- 如果我们有M行,为什么
*array有N个参数? -
*array的大小是多少(也可以是数字)?我理解 malloc() 部分的结果仅作为 M*N,但结构的单个块 (1d)。 - 仅在 malloc 中传递的 M 大小如何变成行数?怎么变成
*array[M][N]?
非常感谢您的回答。
【问题讨论】:
-
1.
N是列数。 2.*array是Nints的数组,所以sizeof *array等于N * sizeof(int),M * sizeof *array等于M * N * sizeof(int)。 3.malloc(M * sizeof *array)相当于malloc(M * N * sizeof(int))。与声明的对象不同,malloc分配的块没有有效类型,只有分配的大小。 -
分配的块具有正确的大小和对齐方式,以便它可以容纳
int[M][N]的内容。malloc的返回值被转换为array的类型,即int(*)[N](指向Nints 的数组的指针)。在表达式array[i][j]中,array[i]选择int[N]类型的行,它是Nints 的数组。该数组由表达式转换为指向行的第一个元素的int *。[j]对int *进行操作以选择行的特定元素。如此有效地array[i][j]在一行和一列中选择一个元素。 -
谢谢你的回答,对我来说开始更清楚了。但是,您能告诉我,为什么这些问题如此糟糕以至于帖子被否决了?
标签: c malloc dynamic-memory-allocation dynamic-arrays