对于以下代码
#include <iostream>
using namespace std;
union type
{
int a;
char b ;
};
int main()
{
type first;
first.b = 'a';
cout << first.a << " " << first.b << endl;
}
输出为-858993567 a
(MSVC( 或4201057 a
(g++ MINGW(。
但对于
#include <iostream>
using namespace std;
union type
{
int a;
char b ;
};
int main()
{
type first;
first.a = 0;
first.b = 'a';
cout << first.a << " " << first.b << endl;
}
输出97 a
这些值在任何情况下都是固定的(尝试重新启动并创建新的工作区/文件,因此不是垃圾值(。
那么,为什么初始化(在第二种情况下(会有所不同呢?
我已经在Visual Studio(使用MSVC(和Visual Studio代码(使用g ++(上尝试过。
更新 1我检查了可能使用 Linux g++ 的在线 IDE,它们给出了确切的预期答案,即97 a
,在这两种情况下。
如果您在第一个代码示例中指定 first.a - 您将获得固定的稳定值。
您具有 4 个字节大小的联合,并且只初始化其中一个字节。
联合就像类型谁可以持有任何类型,但这个类型必须写在联合的定义中,就像这样:
union Example {
char a;
std::int32_t b;
};
Example ex; /// Create object of union
ex.a = 'c'; /// At this moment a member is valid and b is invalid
std::cout << ex.b; /// This cause undefined behavior
请注意,联合对象的大小是需要最多字节的类型的大小。在这种情况下,大小与 b 属性的大小相同。