【问题标题】:How do I serially declare structs without making them arrays?如何在不使它们成为数组的情况下连续声明结构?
【发布时间】:2012-06-02 09:56:44
【问题描述】:

我目前在处理结构数组时遇到了一些问题(具体来说,我的数组太大了,占用了 7 兆字节的内存),我开始怀疑我是否真的需要声明所有结构一次并像那样占用内存,而不是在需要新结构时按比例增加它(程序从文件中读取内容,我将文件中的数据存储在结构中;但是它需要读取的东西的数量从文件是不可预测的)。我可以使用什么替代方法,以便程序可以引用单独的、唯一的结构,但不需要提前知道结构的确切数量?

【问题讨论】:

  • 动态分配mallocrealloc? (那么别忘了free。)

标签: c arrays pointers memory-management struct


【解决方案1】:

Linked lists? 或任何其他更高级的数据结构,具体取决于您的目的,但无论如何,一些阅读似乎是有序的 :) 或者如果您正在使用 C++,只需使用 std::list。

【讨论】:

    【解决方案2】:

    我想到了两种方法:

    • 一个可重新分配的数组(可以是结构或指向结构的指针),您需要函数来检查您是否超出界限并重新分配整个数组以防万一(使用realloc
    • 结构的链表,在需要时自动增长,插入和删除是恒定的,但您不会对元素进行快速随机访问索引

    对于链表解决方案,您只需要另一个结构

    struct node
    {
      struct node *prev; // if you want it double linked
      struct node *next;
      struct data data;
    };
    

    选择哪一个主要取决于必须将新项目添加到数据结构中的频率,如果它是批量完成的,那么重新分配会非常有效,否则你会做很多重新分配(你总是可以使用类似于用于哈希映射的方法,并始终将其增加大量,例如通过将容量加倍)。如果您需要快速随机访问,请忘记链表。

    【讨论】:

    • 好的,这太棒了!我可能会用这个。但什么是快速“随机”访问?
    • 随机访问是指您需要访问指定索引处的元素而不是顺序访问它们(例如,在循环中)。如果您需要多次访问元素 data[4]、data[11] 等,那么链表不适合您。
    【解决方案3】:

    您可以使用union 代替strust;它的内存效率更高,并且不会像 struct 那样占用内存。

    【讨论】:

    • -1:struct 包含许多子元素(按指定的顺序,可能在它们之间有一些填充)。 union 仅包含一组子元素中的 一个(您必须记住上次存储的是哪个子元素)。一般来说,它们不可互换。
    猜你喜欢
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多