视觉C++联盟,垃圾价值
visual C++ Union, garbage value
对于以下代码
#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 属性的大小相同。
相关文章:
- 我们可以访问一个不存在的联盟的成员吗
- 视觉C++联盟,垃圾价值
- 让所有成员都活跃在C++联盟中安全吗
- 只有一个成员的匿名联盟
- 为什么C++被称为语言联盟?
- 是匿名联盟成员平等的指示
- 如何以复杂的方式创建联盟?
- 在联盟中,不愿命名的未命名结构的成员是错误或GCC错误
- 没有htonl/ntohl的联盟和终点
- 重新诠释联盟与不同的工会
- 可以在C 中实例化匿名联盟吗?
- 进入联盟中的课程
- 库达型双关语 - memcpy vs UB 联盟
- 为什么该浮点联盟的输出是NAN的
- 根据不同的类型,联盟成员仅在一个类中
- vs C 交叉末日联盟
- 联盟中的位字段 - 这是多么便携
- 取消引用指向联盟成员的指针
- C++编译错误:请求成员"c_cflag"不是结构或联盟
- 联盟内部结构