我偶然发现了一段基于 C 语言联合的代码。代码如下:
union {
struct {
char ax[2];
char ab[2];
} s;
struct {
int a;
int b;
} st;
} u ={12, 1};
printf("%d %d", u.st.a, u.st.b);
我只是不明白输出是怎么来的268 0
。这些值是如何初始化的?
工会在这里运作得怎么样?输出不应该是12 1
。如果有人能详细解释这里到底发生了什么,那就太好了。
我使用的是 32 位处理器和 Windows 7。
该代码并没有按照您的想法进行。大括号初始化初始化first工会成员,即u.s
。但是,现在初始化程序不完整并且缺少大括号,因为u.s
包含两个数组。它应该是这样的:u = { { {'a', 'b'}, { 'c', 'd' } } };
你应该永远编译时出现所有警告,一个像样的编译器应该告诉你有些地方出了问题。例如,海湾合作委员会说,missing braces around initialiser (near initialisation for ‘u.s’)
and missing initialiser (near initialisation for ‘u.s.ab’)
。很有帮助。
在 C99 中,您可以利用命名成员初始化来初始化第二个联合成员:u = { .st = {12, 1} };
(顺便说一句,这在 C++ 中是不可能的。)第一种情况的相应语法是`u = { .s = { {'a', 'b'}, { 'c', 'd' } } };
,这可以说更加明确和可读!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)