C 如何连续声明结构而不使其成为数组?

C 如何连续声明结构而不使其成为数组?,c,arrays,pointers,memory-management,struct,C,Arrays,Pointers,Memory Management,Struct,我目前在使用结构数组时遇到了一些问题(特别是,我的数组太大了,占用了7兆的内存),我开始怀疑我是否真的需要一次声明所有结构并像那样占用内存,而不是在需要新结构时按比例增加它(程序从文件中读取内容,我将文件中的数据存储在structs中;但它需要从文件中读取的内容数量是不可预测的)我可以使用什么替代方案,以便程序可以引用单独的、唯一的结构,但不需要预先构造的确切数量?< P>或任何其他更高级的数据结构,取决于您的目的,但是无论如何,一些阅读似乎是按顺序的:)或者如果您正在做C++,只需使用std:

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

< P>或任何其他更高级的数据结构,取决于您的目的,但是无论如何,一些阅读似乎是按顺序的:)或者如果您正在做C++,只需使用std::list。

我想到两种方法:

  • 一个reallocacable数组(可以是结构或指向结构的指针),您需要函数来检查是否超出边界,并在case中realloc整个数组(使用
    realloc
  • 结构的链表,在需要时会自动增长,插入和删除是不变的,但您不会对元素进行快速随机访问索引
对于链表解决方案,您只需要另一个结构

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

选择哪种方法主要取决于必须向数据结构中添加新项的频率,如果是批量进行的,则重新分配将非常有效,否则您将执行许多重新分配(您可以始终使用与哈希映射类似的方法,并始终将其大量增加,例如通过加倍容量). 如果您需要快速随机访问,请忘记链表。

您可以使用
联合
而不是
strust
;它的内存效率更高,并且不像
结构那样占用内存。

使用
malloc
realloc
动态分配?(那么,别忘了
free
)-1:struct
包含许多子元素(按照指定的顺序,可能在它们之间有一些填充)。
union
只保存一组子元素中的一个(您必须记住上次存储的是哪一个)。一般来说,它们是不能互换的。好吧,这太棒了!我可能会用这个。但是什么是快速“随机”访问呢?随机访问是指您需要以指定的索引访问元素,而不是按顺序访问它们(例如在循环中)。如果需要多次访问元素数据[4]、数据[11]等,则链表不是您的解决方案。