【问题标题】: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 中的类型好得多)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-26
      • 1970-01-01
      • 2022-11-07
      • 2017-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多