C++ 以下联合中的值是如何分配的?

C++ 以下联合中的值是如何分配的?,c++,c,arrays,unions,C++,C,Arrays,Unions,在下面的代码中,int的值可以预测(如何预测?),还是仅仅是垃圾 union a { int i; char ch[2]; }; a u; u.ch[0] = 0; u.ch[1] = 0; cout<<u.i; } union a { int i; char-ch[2]; }; a美国; u、 ch[0]=0; u、 ch[1]=0; cout我认为这取决于int和char的大小。联合包含最大变量的内存。如果int是4个字节,而char[2]代表2个字节,则int

在下面的代码中,int的值可以预测(如何预测?),还是仅仅是垃圾

union a
{
    int i;
    char ch[2];
};
a u;
u.ch[0] = 0;
u.ch[1] = 0;
cout<<u.i;
}
union a
{
int i;
char-ch[2];
};
a美国;
u、 ch[0]=0;
u、 ch[1]=0;

cout我认为这取决于
int
char
的大小。
联合
包含最大变量的内存。如果
int
是4个字节,而
char[2]
代表2个字节,则
int
char
-数组消耗更多内存,因此您没有通过设置所有
char
-变量将完整的
int
-内存初始化为0。这取决于内存初始化机制,但基本上,
int
的值将显示为随机值,因为额外的2个字节中填充了未指定的值

此外,在我的工作中,填充
联合的一个变量并读取另一个变量正是使联合不安全的原因

如果确定
int
是最大的数据类型,则可以通过编写

union a
{
    int i;
    char ch[2];
};

void foo()
{
    a u = { 0 };  // Initializes the first field in the union
    cout << u.i;
}
union a
{
int i;
char-ch[2];
};
void foo()
{
u={0};//初始化联合中的第一个字段

cout我认为这取决于
int
char
的大小。一个
union
包含最大变量的内存。如果
int
是4个字节和
char[2]
表示2个字节,
int
char
-数组消耗更多内存,因此您没有通过设置所有
char
-变量将整个
int
-内存初始化为0。这取决于您的内存初始化机制,但基本上
int
的值与ext一样随机RA2字节用未指定的值填充

此外,在我的工作中,填充
联合的一个变量并读取另一个变量正是使联合不安全的原因

如果确定
int
是最大的数据类型,则可以通过编写

union a
{
    int i;
    char ch[2];
};

void foo()
{
    a u = { 0 };  // Initializes the first field in the union
    cout << u.i;
}
union a
{
int i;
char-ch[2];
};
void foo()
{
u={0};//初始化联合中的第一个字段


无法复制其未定义的行为,但可能仍然有效。@R.MartinhoFernandes:在我看来,有些关联,但根本不是重复。@Gorpik有什么区别?@R.MartinhoFernandes:这一次,它处理的是
联合
,另一个问题是简单的
int
。此外,在e
union
不必覆盖与
int
相同的内存(在大多数实现中,它们实际上没有)正如Luchian和askmish正确指出的那样,这是UB,而另一个不是。它的未定义行为可能重复,但可能仍然有效。@R.MartinhoFernandes:在我看来,有点相关,但一点也不重复。@Gorpik有什么区别?@R.MartinhoFernandes:这一次,它处理的是一个
联盟
,另一个问题是w另外,
union
中的
char
不必覆盖与
int
相同的内存(在大多数实现中,它们实际上不覆盖)正如Luchian和askMISH正确地指出的,这是UB,而另一个则不是。而且它正好是 Cuth的两个主要用途之一(另一个是简单的多态性,这在C++中是无关的)。在C++中,使用<代码>联合<代码>是非常无用的,因为它可以被代码< > RealTytCase<代码>取代。C中确实有用。结果还取决于处理器的字节数。当代码被编译在MIPS(其中Car(0)将是最重要字节)和x86处理器时,会观察到不同的结果。(是小尾数,字符[0]将是最低有效字节)例如,访问除存储到中的最后一个成员之外的联合成员不会导致未定义的行为。根据C 1999 6.2.6.1 7,与存储到中的成员字节不对应的成员字节采用未指定的值。因此,程序的行为必须与该成员具有某个值一样;这与未定义的行为不同因为后者允许任何行为(陷阱表示可能会带来额外的复杂性,我在这里不再详述,它们通常不适用于简单的整数类型)你是对的,谢谢,这不是真正的未定义行为。我编辑了我的答案。我只是认为这是未定义的行为,因为程序可能期望int被初始化为0,而值可以是任何东西,真的。而且它恰好是
union
的两个主要用途之一。(C++中的另一种简单的多态性,C++中无关),使用< <代码>联合>代码>是非常无用的,因为它可以用“代码> ReExtReType Case<代码>代替。在C中确实有用。结果也取决于处理器的顺序。当代码被编译在MIPS上时,会观察到不同的结果(Char(0)。将是最高有效字节)和x86处理器(小端字节,字符[0]将是最低有效字节)例如,访问除存储到中的最后一个成员之外的联合成员不会导致未定义的行为。根据C 1999 6.2.6.1 7,与存储到中的成员字节不对应的成员字节采用未指定的值。因此,程序的行为必须与该成员具有某个值一样;这与未定义的行为不同因为后者允许任何行为(陷阱表示可能会带来额外的复杂性,我在这里不再详述,它们通常不适用于简单的整数类型)你是对的,谢谢,这不是真正的未定义行为。我编辑了我的答案。我只是认为它是未定义的行为,因为程序可能期望int被初始化为0,而值可以是任何东西,真的。