【问题标题】:2d array declaration with malloc - explanation to the answer (parameters)带有 malloc 的 2d 数组声明 - 答案解释(参数)
【发布时间】:2021-03-29 03:29:51
【问题描述】:

我知道已经发布了一些关于使用 malloc 的 2d 数组的问题,但是,对于其中一个问题,我想参考 answer

我无法想象以下片段的实现:

像这样分配 M 行 N 列的数组:

int (*array)[N] = malloc(M * sizeof *array);
  1. 如果我们有M行,为什么*array有N个参数?
  2. *array 的大小是多少(也可以是数字)?我理解 malloc() 部分的结果仅作为 M*N,但结构的单个块 (1d)。
  3. 仅在 malloc 中传递的 M 大小如何变成行数?怎么变成*array[M][N]

非常感谢您的回答。

【问题讨论】:

  • 1. N 是列数。 2.*arrayNints的数组,所以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


【解决方案1】:

如果我们有 M 行,为什么 *array 有 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 字节。

更多详情可以在这里找到:Correctly allocating multi-dimensional arrays

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    • 2012-09-12
    • 2013-02-24
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多