struct A {
int num,
struct B *data0, *data1 , *data2
};
对于上面的示例代码,“数据”的数量可能会发生变化。目前,是3。 假设我想从用户那里获取输入并相应地为其分配内存。 我想把它转换成一个数组,比如 *data[]。
但是如何动态分配这个数组并访问它,因为每个成员都应该是指向结构 B 的有效指针
答案 0 :(得分:1)
在开始动态分配结构体成员之前,最好先了解 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
中的类型要好得多)
答案 1 :(得分:0)
当“数据”成员的数量可以改变时,当然你应该使用类似数组的样式。
@O__________ 在另一个答案中建议的灵活数组成员是好的,如果 struct A
始终是动态分配的,并且您不需要更改数组 af 创建中的指针数量。
如果想让 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 个指针。