假设我有一个平坦的、动态分配的一维数组(我们称它为 vector
),它将包含一些 3d 数据。有什么方法可以创建另一个指针(让我们称它为 tensor
),将 vector
视为 3d 数组,这样我就可以将其作为 tensor[i ][j][k]
?
我尝试了以下方法,但它不起作用:
int x, y, z; //Number of rows, cols, ...
double *vector;
double ***tensor;
x = 10; y = 10; z = 10;
vector = (double *) malloc(x * y * z * sizeof(double));
tensor = (double ***) vector;
tensor[0] = (double **) vector;
tensor[0][0] = (double *) vector;
for(j = 1; j < y; j++) {
tensor[0][j] = tensor[0][j-1] + z;
}
for(i = 1; i < x; i++) {
tensor[i] = tensor[i - 1] + y;
tensor[i][0] = tensor[i - 1][0] + y * z;
for(j = 1; j < y; j ++) {
tensor[i][j] = tensor[i][j - 1] + z;
}
}
tensor[0][0][0] = 1.0; //Segfaults here
tensor[0][0][1] = 2.0;
...
我做错了什么?
最佳答案
我可以举个例子,将二维数组分配为指针数组加上一维数据数组 在一个 malloc 中
const int M = 100;
const int N = 200;
int **a = NULL;
int i, j;
a = malloc(M * sizeof(int*) + N * M * sizeof(int));
a[0] = (int*)(a + M);
for (i = 1; i < M; i++) {
a[i] = a[0] + i * N;
}
//some code
free(a);
一张图片
在两个 mallocs 中
const int M = 100;
const int N = 200;
int **a = NULL;
int i;
a = malloc(M * sizeof(int*));
a[0] = malloc(M * N * sizeof(int));
for (i = 1; i < M; i++) {
a[i] = a[0] + i * N;
}
//Some code
free(a[0]);
free(a);
一张图片
这里有两个好处:第一 - 快速分配,第二 - a[0] 是一维数组的开始,所以你可以把它当作一维。是的 - 我懒得发布 3d 阵列的完整解决方案。
关于将 * 指针转换为 *** 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25098461/