C结构初始化

时间:2013-07-04 07:57:22

标签: c structure

我从互联网上获得了以下代码:

struct {
   int x;
   struct {
       int y, z;
   } nested;
} i = { .nested.y = 5, 6, .x = 1, 2 };

结果是:

i.nested.y = 2
i.nested.z = 6

但我不知道为什么,网上的文章没有给出任何解释。

3 个答案:

答案 0 :(得分:4)

非指定的初始值设定项始终在结构中的下一个元素上运行。因此,最新的2针对.x之后的内容进行操作,即.nested.y。同样,6适用于nested.z

如果初始值设定项具有多个元素值,则列表中的最后一个值将获胜。

但是如果你有编译器实现指定的初始化器,那么就没有理由不使用它们。你给出的例子非常遥远,没有多少教育价值。

答案 1 :(得分:0)

不知道我是如何误读这首的,感谢Jens指出这一点。

它只是“一如既往地”初始化连续元素,但是指示符用于首先将当前元素更改为.nested.y,将其初始化为5,然后将后续元素.nested.z初始化为6得到2,依此类推。最终的.nested.y会覆盖int

这是相当混淆的代码,因为初始化器的数量大于结构中{{1}}个字段的数量,“fishy”(又名“聪明”)正在发生。

答案 2 :(得分:0)

好的,首先让我说这是一种初始化结构的可怕方法,如果这是一个功课问题 - 它也不是一个非常好的问题。 但是,考虑到手头的问题,我认为在初始化中发生的事情是这样的:首先,y被初始化为5,并且z,作为struct中的下一个成员,被初始化为6.然后,x被初始化为1并且结构中的下一个成员(在本例中为y)初始化为2(覆盖5)。

重要的是要注意的是,嵌套结构不是联合,而是结构 - 首先,因为这就是代码所说的,但也因为如果它是一个联合 - 它将是不可能的这种情况下y和z具有不同的值,因为两者都将保存在内存中的相同位置。 :由Eran Zimmerman在Grijesh Chauhan提供的链接中回答