我要做的是定义指针数组,每个元素指向具有不同数组大小的指针数组,每个元素指向具有不同数组大小的指针数组,每个元素指向结构。
我需要这样的东西:
数组[10]->[12]->[8] = (结构*)malloc(sizeof(结构)); 数组[9]->[16]->[2] = (结构*)malloc(sizeof(结构));
如何分配内存以及如何访问这个数组成员?
哈维尔。
我要做的是定义指针数组,每个元素指向具有不同数组大小的指针数组,每个元素指向具有不同数组大小的指针数组,每个元素指向结构。
我需要这样的东西:
数组[10]->[12]->[8] = (结构*)malloc(sizeof(结构)); 数组[9]->[16]->[2] = (结构*)malloc(sizeof(结构));
如何分配内存以及如何访问这个数组成员?
哈维尔。
如果我理解正确,您需要一个指向 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_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 );
我希望这是你想要的:
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#。
到目前为止,我说得对,并且您想将不同大小的结构存储在 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;