我要做的是定义指针数组,每个元素指向具有不同数组大小的指针数组,每个元素指向具有不同数组大小的指针数组,每个元素指向结构。< / p>
我需要这样的东西:
array[10]->[12]->[8] = (structure*)malloc(sizeof(structure)); array[9]->[16]->[2] = (structure*)malloc(sizeof(structure));
如何分配内存以及如何访问此阵列成员?
哈维尔。
答案 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_rows
和number_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;