转换为 VLA 类型时的内存分配
Memory allocation when casting to a VLA type
我对我正在使用的应用程序中的内存分配和对指针矩阵的访问感到困惑。
有一个矩阵定义为:
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,主要是想知道第四个索引是寻址什么
非常感谢您的帮助!
此 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]
来访问 第二个 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
,维度是 [=33] =].
我对我正在使用的应用程序中的内存分配和对指针矩阵的访问感到困惑。
有一个矩阵定义为:
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,主要是想知道第四个索引是寻址什么
非常感谢您的帮助!
此 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]
来访问 第二个 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
,维度是 [=33] =].