【问题标题】:Expandable array to store pointers in C用于在 C 中存储指针的可扩展数组
【发布时间】:2015-11-08 19:19:15
【问题描述】:

我整天都在寻找,但我找不到可以做我正在寻找的事情的人。我正在尝试找到一种方法来创建指针数组。

类似于 Tree 数据结构,但我想创建一个可扩展的数组来存储许多指针,而不是仅使用左右指针。有没有办法做到这一点?

struct Test{
    char label[100]; 
    float fear;
    float anger;
    float disgust;
    float sad;
    float happy;
    float surprise;
    struct Test *connect[];
};

我在上面包含了我的结构,所以我想要的是 connect 能够在我需要时随时扩展,同时存储指向其他测试的指针。


我尝试使用 malloc,但似乎我做得不对,这是我的尝试:

typedef struct 测试测试;

在函数中 (*tst)->connect = malloc(sizeof(test));

【问题讨论】:

  • 看来您需要 flexible array member。我认为只有size_t n_connect;struct Test **connect; 成员就足够了。显然,一些callocrealloc 管理将是为了维护这些成员。

标签: c arrays pointers


【解决方案1】:

您需要查看malloc() 和内存分配。您本质上要寻找的是

动态内存分配 - 动态分配内存。

而不是静态内存 - 在编译时分配内存

【讨论】:

  • 我尝试了 malloc,但似乎无法找出正确的代码。我试过这个: (*Tst)->connect = malloc(sizeof(test));其中 'test' 是 typedef struct Test test;
  • @Jeremy 将您的尝试作为附录提出您的问题
  • malloc 代表内存分配,并且将创建一个大小为 1024 的内存位置(例如),如果超过该值,则需要 realloc() 更大的块或 malloc() 更多内存并保持跟踪它。你想怎么做这一切都取决于你,但 reallac() 更容易进行内存管理。
  • 所以如果我想在每个指针上添加一个指针,我需要像这样重新分配它: ((sizeof(connect)/ sizeof(test)) + 1) * sizeof(test) 类似的东西?
  • 更多类似 current_size + sizeof(struct)
【解决方案2】:

您可以使用realloc() 来增加connect 的大小。也可以使用struct Test ** 类型

【讨论】:

  • connect 成员本身不能使用realloc 重新分配,因为它是FAMstruct Test** 类型允许它,尽管它有不同的语义。
【解决方案3】:

如果结构中有 FAM,它会与结构内联分配。您需要 realloc 整个结构来调整 connect 的大小。

稍微扩展一下,在你的结构中

struct Test{
    char label[100]; 
    float fear;
    float anger;
    float disgust;
    float sad;
    float happy;
    float surprise;
    struct Test *connect[];
};

成员connectFAM。 FAM 允许您分配与结构内联的可变大小数组。当需要最小化指针取消引用的数量时,这通常是必要的。但是,它比保持一个简单的指针稍微复杂一些。

realloc 具有带有额外保留内存的 FAM 的结构,请按如下方式调用 realloc...

test = realloc(test, sizeof(struct Test) + fam_cur_size + fam_add_size);

realloc 函数会保留现有内容,甚至会在可能的情况下重复使用相同的内存块。

【讨论】:

    【解决方案4】:

    你已经定义了你需要的东西:)

    struct Test{
        char label[100]; 
        float fear;
        float anger;
        float disgust;
        float sad;
        float happy;
        float surprise;
        struct Test *connect[];
    };
    

    因此,您只需为 Test 类型的对象分配足够的内存。

    例如

    struct Test *objext = malloc( sizeof( struct Test ) + 10 * sizeof( struct Test * ) );
    

    数据成员connect称为灵活数组成员。

    只有添加一个包含数组中元素数量的数据成员才是可取的。

    【讨论】:

    • 不明白他会用+ 10 * sizeof( struct Test * )内存做什么?他必须进行第二次分配,例如:objext->connect = malloc ( 10 * sizeof( struct Test * ) ).
    • @i486 他将在那里存储他指向其他类型测试对象的指针。
    • 好的,我明白了。我假设connect 是双指针。如果作者想要动态扩展connect成员,必须定义为struct Test **connect;,并且Test对象的大小是固定的。
    • @i486 有两种方法:要么使用灵活的数组成员,要么进行两次分配,一个用于结构,另一个用于数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-20
    • 1970-01-01
    相关资源
    最近更新 更多