在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 运行时不会将 malloced 页面映射到程序的地址空间,直到它们被触及。初始化它们会破坏这种优化。

优势在于减少和修复错误。取消引用初始化为 NULL 的指针会导致许多现代 OS/CPU 立即出现段错误。这种“快速失败”的行为是一件好事。未初始化的指针可以指向真实数据,因此有缺陷的代码会继续运行,产生错误的答案或在很久以后失败。初始化值在调试器和错误消息中也更有意义。它们还可以添加自初始化以来未使用位置的断言,以检测意外覆盖。

由于这些优点,即使初始化成本太高,一些程序也设计有“调试模式”,包括额外的初始化和使用预处理器指令检查代码,或者在运行时动态启用/禁用它们。

【讨论】:

以上是关于在c中初始化结构数组的主要内容,如果未能解决你的问题,请参考以下文章

在C中参考命名的结构成员直接初始化或分配变量数组的结构成员?

c语言中,结构体初始化和数组初始化的写法是否一样的?求解,谢谢

在c中的结构中初始化多维数组

在C ++中初始化一个指向结构的指针数组

C中结构数组的部分初始化

C语言中的结构体,结构体数组