在c中初始化结构数组
Posted
技术标签:
【中文标题】在c中初始化结构数组【英文标题】:initialize array of struct in c 【发布时间】:2018-07-08 15:45:09 【问题描述】:我应该将一些信息存储在一个结构的向量中,该向量一次输入一点。我事先知道数组的大小。我的问题是:我应该用对我来说代表无效输入的结构来初始化数组吗?例如,我应该执行以下操作:
typedef struct mystruct
int ID;
int xvalue;
my_struct;
#define NO_INPUT (my_struct) ID=-1, xvalue=0
其中 ID=-1 是一个对我来说没有意义的输入。定义后我应该将数组初始化为 NO_INPUT 吗?最佳做法是什么? PS #define 指令对吗?是否兼容 C89 标准?提前致谢!
【问题讨论】:
没有足够的信息。这取决于您要解决的问题。在某些算法中,您事先知道给定值尚未设置,而在另一些算法中,您有义务提供初始值。 ID=-1, xvalue=0
--> .ID=-1, .xvalue=0
。你有没有在一个工作代码示例中尝试过这个,你有minimal reproducible example吗?
【参考方案1】:
选择在没有必要时初始化存储具有成本和优势。 C 让你选择你的毒药。
代价是触及每个分配的字节。对于大型阵列,这可能很昂贵。它可能会损害 CPU 缓存性能。一些 C 运行时不会将 malloc
ed 页面映射到程序的地址空间,直到它们被触及。初始化它们会破坏这种优化。
优势在于减少和修复错误。取消引用初始化为 NULL 的指针会导致许多现代 OS/CPU 立即出现段错误。这种“快速失败”的行为是一件好事。未初始化的指针可以指向真实数据,因此有缺陷的代码会继续运行,产生错误的答案或在很久以后失败。初始化值在调试器和错误消息中也更有意义。它们还可以添加自初始化以来未使用位置的断言,以检测意外覆盖。
由于这些优点,即使初始化成本太高,一些程序也设计有“调试模式”,包括额外的初始化和使用预处理器指令检查代码,或者在运行时动态启用/禁用它们。
【讨论】:
以上是关于在c中初始化结构数组的主要内容,如果未能解决你的问题,请参考以下文章
在C中参考命名的结构成员直接初始化或分配变量数组的结构成员?