联合初始化在c

我想知道union变量是否会像结构变量一样被初始化……

#include int main(void) { struct a { int i; char c; }; struct a ob={4}; printf("%d",ob.c); 

}
上面的代码给出0作为输出..
因此当我初始化时,c也会被初始化..
在下面的代码中……如果union成员整数也用字符数组初始化,那么这个代码片段会给输出515 …
(我通过使用malloc..it为union变量分配内存来validation它。工作正常。)

 #include int main(void) { union a { int i; char c[2]; }; union a ob; ob.ch[0]=3; ob.ch[1]=2; printf("%d",ob.i); return 0; } 

但是没有分配内存它是否可以初始化int i ..(此代码中int i的hex值设置为0x990203)。
我认为99的结果表明高位不是初始化的。
我对么?..

最近写入的成员之外的联合成员读取您最近编写的成员的“字节足迹”导致未定义的未指定行为。 在你写完之前你不应该读i :无论你看到什么,都有非便携式垃圾。

编辑1编辑以回应Cristoph的评论。

如果新值恰好是int类型的陷阱表示(罕见),则通过char赋值可能导致未定义的行为。

您使用union示例不是初始化,而只是一个赋值,因此它只会更改您正在访问的字节,而另一个则保留非特定值。 对于工会来说,对最广泛的成员进行初始化是一个好主意

 union a ob = { .i = 0 }; 

因此,您可以保证对象的所有字节都初始化为0

我认为99是结果表明高位不是初始化..我是否正确?…

更正是因为您只在第二个示例中显式分配了两个字节,因此整数的两个字节保持未初始化。 在第一个示例中,您将4分配给i ,这是一个整数并与c共享一个字节。 但是,如果两个联合成员的类型相同,则假设两者都将被初始化是正确的。 此外,为联合分配的空间是其最大成员占用的空间,因此假设当您分配给c[x]时, i某些字节将发生变化,这不会是错误的。

在不同的范围和上下文中,您可以看到具有不同初始化方法的未初始化字节的不同值是不相关的,特定于案例且未定义。 但是,我不能对515发表评论,因为我不清楚你是如何获得这个价值的。