视觉C++联盟,垃圾价值

visual C++ Union, garbage value

本文关键字:C++ 联盟 视觉      更新时间:2023-10-16

对于以下代码

#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 属性的大小相同。