【问题标题】:C++ Union, garbage value [duplicate]C ++联合,垃圾值[重复]
【发布时间】:2020-09-18 08:16:28
【问题描述】:

如下代码

#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 code(使用g++)上都试过了。

更新 1 我检查了可能使用 Linux g++ 的在线 IDE,在这两种情况下,它们都给出了确切的预期答案,即97 a

【问题讨论】:

  • 您的程序表现出未定义的行为,通过在对象的生命周期开始之前访问对象(联合的非活动成员)。
  • @Ron 检查更新 1
  • @IgorTandetnik 检查更新 1
  • 未定义的行为是未定义的。 “似乎有效”是未定义行为的一种可能表现形式。
  • “确切的预期答案”不存在,因为您的程序具有未定义的行为。

标签: c++ visual-c++ g++ msvc12


【解决方案1】:

如果您在第一个代码示例中指定 first.a - 您将获得固定、稳定的值。

你有 4 字节大小的联合,并且只初始化其中的一个字节。

【讨论】:

  • 检查更新一
  • 好的,阿贝。如果您打算仅在在线 IDE 上编译和运行代码,您可以睡个好觉。但在其他情况下,您可以使用未定义的值获得未定义的行为。
【解决方案2】:

union 就像 type 可以容纳任何类型,但是这个类型必须写在 union 的定义中,像这样:

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

【讨论】:

  • 谁能看出我写错了什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多