联合初始化在c

时间:2012-03-22 14:48:37

标签: c

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

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

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

#include<stdio.h>
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的十六进制值设置为0x990203)。
我认为99的结果表明较高位不是初始化的。
我是对的吗?..

3 个答案:

答案 0 :(得分:2)

从你最近写过的成员的“字节足迹”之外的最近写入的联盟成员中读取 undefined 未指明的行为。在你写完之前你不应该阅读i:无论你看到什么,都有非便携式垃圾。

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

答案 1 :(得分:1)

  

我认为99是表明高位不是的结果   初学者..我是对的吗?..

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

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

答案 2 :(得分:1)

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

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

union a ob = { .i = 0 };

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