指针的三维数组,其中每个维度在C中的大小不同

时间:2013-08-19 10:16:24

标签: c pointers multidimensional-array

我要做的是定义指针​​数组,每个元素指向具有不同数组大小的指针数组,每个元素指向具有不同数组大小的指针数组,每个元素指向结构。< / p>

我需要这样的东西:


    array[10]->[12]->[8] = (structure*)malloc(sizeof(structure));
    array[9]->[16]->[2] = (structure*)malloc(sizeof(structure));

如何分配内存以及如何访问此阵列成员?

哈维尔。

3 个答案:

答案 0 :(得分:3)

如果我理解正确,你需要一个指向struct的锯齿状3D数组,这样每个i可以有不同数量的j,并且对于每个j,可以有不同数量的k

假设情况确实如此,你可以尝试这样的事情:

typedef struct { ... } structure;

structure ****arr = malloc( sizeof *arr * number_of_pages );
for( size_t page = 0; page < number_of_pages; page++ )
{
  arr[page] = malloc( sizeof *arr[page] * number_of_rows( page ));
  for ( size_t row = 0; row < number_of_rows( page ); row++ )
  {
    arr[page][row] = malloc( sizeof *arr[page][row] * number_of_cols( page, row ));
    for ( size_t col = 0; col < number_of_cols( page, row ); col++ )
    {
      arr[page][row][col] = malloc( sizeof *arr[page][row][col] );
    }
  }
}

您需要添加检查以确保每个malloc调用成功;我把它们留下来只是为了让代码保持一半可读性。

这假定存在一些函数number_of_rowsnumber_of_cols,它们分别返回每个“页面”的行数和每个“页”和行的列数。

arr是指向指向struct类型指针的指针的指针;因此,各种表达的类型是:

    Expression                   Type
    ----------                   ----
           arr                   structure ****
        arr[i]                   structure ***
     arr[i][j]                   structure **
  arr[i][j][k]                   structure *
 *arr[i][j][k]                   structure

您将以

的形式访问结构的每个成员
arr[i][j][k]->member;

修改

请注意,您必须按照分配的相反顺序释放内存:

for ( size_t page = 0; page < number_of_pages; page++ )
{
  for ( size_t row = 0; row < number_of_rows( page ); row ++ )
  {
    for (size_t col = 0; col < number_of_cols( page, row ); col++ )
    {
      free( arr[page][row][col] );
    }
    free( arr[page][row] );
  }
  free( arr[page] );
}
free( arr );

答案 1 :(得分:1)

我希望这就是你想要的:

MyStruct*** ddd = malloc(sizeof(MyStruct**) * 2);

ddd[0] = malloc(sizeof(MyStruct*) * 3);
ddd[0][0] = malloc(sizeof(MyStruct) * 2);
ddd[0][1] = malloc(sizeof(MyStruct) * 1);
ddd[0][2] = malloc(sizeof(MyStruct) * 4);

ddd[1] = malloc(sizeof(MyStruct*) * 1);
ddd[1][0] = malloc(sizeof(MyStruct) * 3);

=&GT;

0: [
    0: [
        0: MyStruct,
        1: MyStruct
    ],
    1: [
        0: MyStruct
    ],
    2: [
        0: MyStruct,
        1: MyStruct,
        2: MyStruct,
        3: MyStruct
    ]
],
1: [
    0: [
        0: MyStruct,
        1: MyStruct,
        2: MyStruct
    ]
]

如果有问题请纠正我,我是徒手写的,我通常只写C ++ / C#。

答案 2 :(得分:0)

到目前为止我帮你了,你想在3d数组中存储不同大小的结构,我会这样做:

typedef struct struct_s
{
    size_t sizeofElement;
    void *ptrToElement;
}struct_t;

void main(void)
{
    struct_t array[X][Y][Z];
    /*...*/
    array[x][y][z].ptrToElement = malloc (sizeof (structure));
    array[x][y][z].sizeofElement = sizeof (structure);

}

因此,您可以使用此数组处理不同大小的对象。并通过询问他们的大小来处理它们。

编辑:

请记住,你不能让不同的dimmensions有不同的尺寸,因为

array[x][y][z];

只是请求内存为

void ***ptr = malloc (sizeof(type)*x + sizeof(type)*y + sizeof(type)*z;

会做的。

所以只需将自己的指针分成

即可
 void ***ptr = malloc (sizeof(type1)*x + sizeof(type2)*y + sizeof(type3)*z;