【发布时间】:2016-03-21 21:58:16
【问题描述】:
我正在使用可变大小的 3D 和 4D 数组,它们必须是连续的(有时更容易调用 *(&x[0][0][0] + k) 而不是 'x[][][]' 方式)。因为数组的大小可变,我需要动态分配。我在另一个答案 (Dynamic memory allocation for 3D array) 中找到了这段代码,它工作正常,但我不知道堆栈使用了多少内存。
double ***arr3dAlloc(const int ind1, const int ind2, const int ind3) {
int i;
int j;
double ***array = (double***)malloc((ind1 * sizeof(double*)) +
(ind1 * ind2 * sizeof(double**)) +
(ind1 * ind2 * ind3 * sizeof(double)));
for (i = 0; i < ind1; ++i) {
array[i] = (double**)(array + ind1) + i * ind2;
for (j = 0; j < ind2; ++j) {
array[i][j] = (double*)(array + ind1 + ind1 * ind2) + i * ind2 * ind3 + j * ind3;
}
}
return array;
}
问题是:
double ***arr1 = arr3dAlloc(N1,N2,N3);和double arr2[N1][N2][N3];有什么区别鉴于
arr2使用堆栈的N1*N2*N3*sizeof(double)内存,arr1使用多少内存?只有sizeof(double***)?- 一般来说,有没有一种方法可以测量任何变量的堆栈内存使用情况?
【问题讨论】:
-
没有 3D 或 4D 数组,也没有任何东西可以作为一个数组使用。在 C 语言中,作为 3 星级程序员也绝对不是恭维。大多数情况下,这是设计不佳的信号。
-
代码是针对科学海豚的,所以数组***类似于
population[J][K][N],其中 J 和 K 索引代表空间网格的单元格,N 代表单元格的人口数我,j。代码的粗略部分使用指向第一个元素的指针并进行一些计算,但是一些要计算的函数必须易于编辑和阅读,所以我想使用 population[i][j][n] 表示法。我需要使用相同的方案但不同的“特殊功能”运行多个模拟,所以一直停下来思考“我在哪个内存位置”不是最佳的 -
double ***不是数组甚至是类似的数据结构!指针不是数组。并且 tp 指针不构成 2D 数组, 3 不是 3D 数组。如果需要,为什么不使用真正的数组?狂野的演员应该让你怀疑。你甚至没有分配正确的内存。
标签: c multidimensional-array stack