C 结构体初始化

3
我从互联网上得到了以下代码:
struct {
   int x;
   struct {
       int y, z;
   } nested;
} i = { .nested.y = 5, 6, .x = 1, 2 };

结果是:
i.nested.y = 2
i.nested.z = 6

但我不知道为什么,网络文章没有任何解释。


也在这里提问了,但没有得到答案:http://stackoverflow.com/questions/9787267/i-dont-understand-this-nested-struct - Grijesh Chauhan
.x = 1, 2 设置为继续。 - BLUEPIXY
1
你为什么想知道那个?混合使用指定初始化器和非指定初始化器并不是一个很聪明的做法。无论如何,你尝试过什么了吗?一个好的起点是查阅C标准并尝试理解有关初始化的部分。 - Jens Gustedt
3个回答

4
非指定初始化程序始终在结构中的下一个元素上操作。因此,最新的2作用于.x之后的内容,即.nested.y。同样,6适用于nested.z
如果初始化程序对一个元素有多个值,则列表中的最后一个获胜。
但是,如果您拥有实现指定初始化程序的编译器,那么没有理由不使用它们。您提供的示例非常牵强附会,教育价值不高。

请查看此代码片段的CIL输出,问题来源于这里,以及CIL(C中间语言) - Grijesh Chauhan
确实,标准也是这样规定的。c11标准-6.7.9,17 - VoidPointer

0

我一开始完全没看出来,感谢 Jens 指出。

这只是像往常一样初始化连续的元素,但使用设计器首先将当前元素更改为 .nested.y,它被初始化为 5,然后接下来的元素 .nested.z 得到了 6,以此类推。最后的 2 然后覆盖了 .nested.y

这是相当难懂的代码,因为初始化程序的数量大于结构体中 int 字段的数量,有些“可疑”的事情正在发生。


完全偏离轨道,没有逗号运算符。 - Jens Gustedt

0
首先,让我说一下,这是一种非常糟糕的初始化结构体的方式,如果这是一个作业问题,那么它也不是一个很好的问题。然而,考虑到手头的问题,我认为在初始化中发生的情况是:首先,y被初始化为5,z作为结构体中的下一个成员被初始化为6。然后,x被初始化为1,并且结构体中的下一个成员,在这种情况下是y,被初始化为2(覆盖了5)。
还有一件重要的事情需要注意,嵌套的结构体不是联合体,而是结构体 - 首先,因为代码就是这样写的,但也因为如果它是一个联合体 - 在这种情况下,y和z具有不同的值是不可能的,因为两者都将保存在内存中的相同位置。 : 由Grijesh Chauhan提供的链接上Eran Zimmerman的回答

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接