我试图在堆上声明一个三维结构数组。
说我有以下结构:
struct data
{
double x;
double y;
};
我有:
typedef struct data data_t;
尺寸也是:
int dim1, dim2, dim3;
我无法找到一种方法来建立一个三维结构阵列
答案 0 :(得分:2)
data_t ***arr;
arr = malloc(sizeof(*arr) * dim1);
for (int i = 0; i < dim1; i++) {
arr[i] = malloc(sizeof(*arr[i]) * dim2);
for (int j = 0; j < dim2; j++) {
arr[i][j] = malloc(sizeof(*arr[i][j]) * dim3);
}
}
答案 1 :(得分:0)
使用循环进行内存分配。
data_t ***3d_arrOfStruct = malloc(dim1*sizeof(data_t **);
for(int i = 0; i < dim2; i++)
{
3d_arrOfStruct[i] = malloc(dim2*sizeof(data_t *);
for(int j = 0; i < dim2; j++)
{
3d_arrOfStruct[i][j] = malloc(dim3*sizeof(data_t);
}
}
请注意,这不会分配连续的内存。
答案 2 :(得分:0)
如果您的多维数组不是&#34;锯齿状的&#34; (因为你的问题不是),那么从C99 1 开始,你只能使用一个malloc
电话:
data_t (*p)[dim2][dim3] = malloc(dim1 * sizeof *p);
sizeof *p
已经&#34;知道&#34;每个子维度的大小,因此无需在右侧重复dim2
和dim3
。但是,如果真的想重复自己,那么等效的调用将是:
data_t (*p)[dim2][dim3] = malloc(dim1 * dim2 * dim3 * sizeof p[0][0][0]);
甚至:
data_t (*p)[dim2][dim3] = malloc(dim1 * dim2 * dim3 * sizeof(data_t));
您可以获得此类方法的额外优势,即只需要一次free
调用即可将其整体清理。
这是可行的解决方案:
#include <stdio.h>
#include <stdlib.h>
struct data
{
double x;
double y;
};
typedef struct data data_t;
int main(void)
{
int dim1 = 1, dim2 = 2, dim3 = 3;
data_t (*p)[dim2][dim3] = malloc(dim1 * sizeof *p);
p[0][0][0].x = 0;
p[0][0][0].y = 0;
printf("%f\n", p[0][0][0].x);
free(p);
return 0;
}
1)假设数组的大小不为编译时所知。换句话说,它们不是常量表达式,但在您的问题dim1
中,dim2
和dim3
明确表示为变量。
答案 3 :(得分:-1)
最简单也可能最快的是使用1d数组:
data* cube = (data*)malloc(dim1*dim2*dim3*sizeof(data));
data GetItem(int x, int y, int z)
{
auto index = x + y * dim1 + z * dim1 * dim2;
return cube[index];
}