将 * 指针转换为 *** 指针

标签 c pointers

假设我有一个平坦的、动态分配的一维数组(我们称它为 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);

一张图片

enter image description here

在两个 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);

一张图片

enter image description here

这里有两个好处:第一 - 快速分配,第二 - a[0] 是一维数组的开始,所以你可以把它当作一维。是的 - 我懒得发布 3d 阵列的完整解决方案。

关于将 * 指针转换为 *** 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25098461/

相关文章:

c - 在 C 中使用数组作为参数的函数

c - 如何将 const uint8_t * const 转换为 bool

c - 从函数返回的字符串包含垃圾

c++ - 函数指针指向什么?

c - 使用缓冲区的堆栈损坏

c - 在C语言的.text文件中读取“;”之间的字符串

c - 有没有办法从方法更新/返回数组中的元素?

objective-c - 如何将 HIDAPI 库添加到现有的 Mac 项目

c++ - 错误 C2440 : '=' : cannot convert from 'bool' to 'bool *'

c - 应该使用什么类型来循环数组?