1

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

我需要这样的东西:

    数组[10]->[12]->[8] = (结构*)malloc(sizeof(结构));
    数组[9]->[16]->[2] = (结构*)malloc(sizeof(结构));

如何分配内存以及如何访问这个数组成员?

哈维尔。

4

3 回答 3

3

如果我理解正确,您需要一个指向 a 的参差不齐的 3D 指针数组struct,这样每个指针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 );
于 2013-08-19T10:54:51.443 回答
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);

=>

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#。

于 2013-08-19T10:34:25.133 回答
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);

}

所以你可以处理这个数组不同大小的对象。并通过询问它们的大小来正确处理它们。

编辑:

记住,你不能让不同的维度有不同的大小,因为

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;
于 2013-08-19T10:25:24.753 回答