【问题标题】:Create a multi-Dimensional array of structs on a heap?在堆上创建一个多维结构数组?
【发布时间】:2015-02-20 16:53:20
【问题描述】:

我正在尝试在堆上声明一个 3 维结构数组。

假设我有以下结构:

struct data
{
    double x;
    double y;
};

我有:

typedef struct data data_t;

尺寸也如下所示:

int dim1, dim2, dim3;

我只是想不出一种方法来 malloc 结构的 3-D 数组

【问题讨论】:

  • 您使用的是什么版本的标准?一些较新版本的 C 具有更好的功能,适用于您的问题。
  • malloc 和堆分配变量(也称为“动态分配变量”)需要指针,无论变量是否为数组。

标签: c arrays struct malloc


【解决方案1】:
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);
    }
}

【讨论】:

  • 我想你的意思是sizeof(*arr[i])sizeof(*arr[i][j])
【解决方案2】:

使用循环进行内存分配。

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); 
      }
}  

请注意,这不会分配连续的内存。

【讨论】:

    【解决方案3】:

    如果您的多维数组不是“锯齿状”(正如您的问题不是),那么从 C991 开始,您可以只使用一个 malloc 调用:

    data_t (*p)[dim2][dim3] = malloc(dim1 * sizeof *p);
    

    sizeof *p 已经“知道”每个子维度的大小,因此无需在右侧重复 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) 假设数组的大小在编译时是未知的。换句话说,它们不是常量表达式,但在您的问题中dim1dim2dim3 被明确表示为变量。

    【讨论】:

      【解决方案4】:

      最简单也可能最快的方法是使用一维数组:

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

      【讨论】:

      • @米兰。我同意阿尔特曼的观点。如果它是“C++”,您的解决方案可能是个好主意,但是,问题被标记为(普通)“C”
      • 哦,我错过了它是 C,我很抱歉,而不是使用同样的方法使用 malloc。我对 c++ 的问题进行了过滤,但没有意识到它也显示了来自“其他”语言的问题。
      猜你喜欢
      • 2018-05-14
      • 2019-01-05
      • 2023-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-12
      • 2018-06-17
      • 1970-01-01
      相关资源
      最近更新 更多