当转换为VLA类型时的内存分配

问题描述 投票:0回答:1

我对内存分配感到困惑,并无法访问正在使用的应用程序中的指针矩阵。

有一个矩阵定义为:

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

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

尽管如此,出现以下内容:

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

此演员究竟在做什么?此外,为什么我们需要为这些双打分配内存?我认为矩阵仅包含指针,以后将使用分别声明的double的内存地址进行初始化。

最后,我还是对初始化期间访问此矩阵的方式感到困惑:

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

i和j小于N​​的地方。主要是,我想知道第四索引在处理什么。

非常感谢您的帮助!

c pointers multidimensional-array casting addressing
1个回答
1
投票

double (*foo)[n/m][m][m]创建1个单个指针foo,该指针将用于指向包含类型为double的值的3维数组,其中3维的大小分别为n/mm和[ m,分别表示每个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]

© www.soinside.com 2019 - 2024. All rights reserved.