【问题标题】:Dynamically allocate a member of a structure which is also a structure动态分配结构的成员,该结构也是结构
【发布时间】:2021-08-25 17:05:29
【问题描述】:
struct A {
int num,
struct B *data0, *data1 , *data2
};
对于上述示例代码,“数据”的数量可能会发生变化。目前是3。
假设我想从用户那里获取输入并相应地为其分配内存。
我正在考虑将其转换为数组,例如 *data[]。
然后如何动态分配这个数组并访问它,因为每个成员都应该是指向结构 B 的有效指针
【问题讨论】:
标签:
arrays
c
pointers
multidimensional-array
dynamic-memory-allocation
【解决方案1】:
当“数据”成员的数量可以改变时,当然应该使用类似数组的样式。
如果struct A 始终是动态分配的并且您不需要在创建后更改数组中的指针数量,则@O__________ 在另一个答案中建议的灵活数组成员很好。
如果你想让struct A成为一个局部变量(自动存储时长)或者创建后需要改变大小,你可以这样做:
struct A
{
int num;
struct B **data;
};
并像这样分配:
struct A a;
a.num = getSizeFromUser();
a.data = malloc(a.num * sizeof *a.data);
现在a.data 可以用作struct B 指针数组。示例:
struct B b;
a.data[0] = &b; // Point to an object with automatic storage
a.data[1] = malloc(sizeof *a.data[0]); // Point to an object with allocated storage
然后你就可以这样做
a.data[1]->SomeDataMemberOfStructB = someValue;
使用realloc,您甚至可以在程序执行期间更改指针的数量,例如从8个指针开始,后来增加到16个指针。
【解决方案2】:
在开始动态分配结构成员之前,最好了解 C 语言结构语法。
struct A
{
size_t num;
struct B data[];
};
struct A *alloc(size_t numdata)
{
struct A *data = malloc(szieof(*data) + numdata * sizeof(data -> data[0]));
if(data) data -> num = numdata;
return data;
}
如果要存储指针:
struct A
{
size_t num;
struct B *data[];
};
或二维数组:
#define NCOLUMNS 100
struct A
{
size_t num;
struct B data[][NCOLUMNS];
};
或 3D 数组
#define NCOLUMNS 200
#define NROWS 100
struct A
{
size_t num;
struct B data[][NROWS][NCOLUMNS];
};
等等等等
alloc 函数将保持不变(在这里您可以看到为什么使用对象比 sizeof 中的类型好得多)