动态分配结构的成员,该成员也是结构

时间:2021-06-08 17:03:50

标签: arrays c pointers multidimensional-array dynamic-memory-allocation

struct A {
int num,
struct B *data0, *data1 , *data2
};

对于上面的示例代码,“数据”的数量可能会发生变化。目前,是3。 假设我想从用户那里获取输入并相应地为其分配内存。 我想把它转换成一个数组,比如 *data[]。

但是如何动态分配这个数组并访问它,因为每个成员都应该是指向结构 B 的有效指针

2 个答案:

答案 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 个指针。