我对内存分配感到困惑,并无法访问正在使用的应用程序中的指针矩阵。
有一个矩阵定义为:
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的地方。主要是,我想知道第四索引在处理什么。
非常感谢您的帮助!
此double (*foo)[n/m][m][m]
创建1个单个指针foo
,该指针将用于指向包含类型为double
的值的3维数组,其中3维的大小分别为n/m
,m
和[ 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]
。