【问题标题】:Memory allocation when casting to a VLA type转换为 VLA 类型时的内存分配
【发布时间】:2020-05-19 22:16:14
【问题描述】:

我对我正在工作的应用程序中的内存分配和对指针矩阵的访问感到困惑。

有一个矩阵定义为:

typedef double (*foo)[n/m][m][m];

据我所知,这是一个存储双精度指针的三维矩阵。所有维度的内存分配都是自动完成的。

但还是会出现以下内容:

foo bar = (foo) malloc(sizeof(double) * n * n);

这个演员到底在做什么?此外,为什么我们需要为这些双打分配内存?我认为矩阵只包含指针,稍后将使用单独声明的双精度的内存地址进行初始化。

最后,我也对这个矩阵在初始化期间的访问方式感到困惑:

bar[i/m][j/m][i%m][j%m] = value;

其中i和j小于N​​。主要是想知道第四个索引是指什么。

非常感谢您的帮助!

【问题讨论】:

  • 演员什么也没做。将void* 转换为另一种指针类型时,C 不需要强制转换。
  • @JG55 这个 typedef double (*foo)[n/m][m][m];是指向三维数组的类型指针的别名声明。它不是“存储双精度指针的三维矩阵”
  • 看起来数组维度是 [n/m][n/m][m][m] ,当您通过指向第一个元素的指针 malloc 数组数组时,第一个维度确实不构成类型的一部分。大小可以写成sizeof(int [n/m][n/m][m][m]),但作者优化为n*n
  • see here 例如在 2 维和 3 维中,然后想象额外的 2 暗度
  • 这个double (*foo)[n/m][m][m]创建了1个单指针foo,用于指向包含double类型值的3维数组,其中3维的大小分别为n/mmm,每个 3 维数组中总共有 (n/m)*m*m = n*m double 值。

标签: c pointers multidimensional-array casting addressing


【解决方案1】:

这个double (*foo)[n/m][m][m]创建了1个单指针foo,用于指向包含double类型值的3维数组,其中3维的大小分别为n/mmm,每个 3 维数组中总共有 (n/m)*m*m = n*m double 值。

请注意,您可以对foo 使用指针的算术运算,因此如果foo 指向一个3 维数组,那么foo+1 将指向下一个3 维数组。

在指针表示法中,您可以使用 (*(foo+1))[0][0][0] 来访问 second 3 维数组的第一个 double 值,您可以使用数组表示法将其重写为 foo[1][0][0][0] 以执行相同的操作事物。所以现在您可以看到,通过迭代 foo,您正在迭代 4 维数组的第 4 维。

从代码中我们看到它为这个 4 维数组分配了 n*n double 值。因此,由于我们不知道第四维的大小,我们可以说数组的维度类似于[x][n/m][m][m],其中x 是未知大小。但是我们确实知道这个4维数组会有n*n元素,所以要找到x我们需要解x*(n/m)*m*m = n*n,因此x = n/m,维度是[n/m][n/m][m][m]

【讨论】:

    猜你喜欢
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 2015-12-24
    • 2021-10-08
    • 2021-11-27
    • 2013-09-29
    • 2014-09-22
    • 1970-01-01
    相关资源
    最近更新 更多