在堆上创建多维结构数组?

时间:2015-02-20 16:53:21

标签: c arrays struct malloc

我试图在堆上声明一个三维结构数组。

说我有以下结构:

struct data
{
    double x;
    double y;
};

我有:

typedef struct data data_t;

尺寸也是:

int dim1, dim2, dim3;

我无法找到一种方法来建立一个三维结构阵列

4 个答案:

答案 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;每个子维度的大小,因此无需在右侧重复dim2dim3。但是,如果真的想重复自己,那么等效的调用将是:

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中,dim2dim3明确表示为变量。

答案 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];
}