【发布时间】: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/m,m和m,每个 3 维数组中总共有(n/m)*m*m = n*mdouble值。
标签: c pointers multidimensional-array casting addressing