我的代码是这样

// using_a_union.cpp
#include <stdio.h>

union NumericType
{
    int         iValue;
    long        lValue;
    double      dValue;
};

int main()
{
    union NumericType Values = { 10 };   // iValue = 10
    printf("%d\n", Values.iValue);
    Values.dValue = 3.1416;
    printf("%d\n", Values.iValue); // garbage value
}

为什么在执行Values.iValue之后尝试打印Values.dValue = 3.1416时,为什么会得到垃圾值?
我认为内存布局将类似于thisValues.iValue和会发生什么
我为Values.lValue;分配内容时的Values.dValue吗?

最佳答案

union中,所有数据成员都重叠。您一次只能使用一个 union 的数据成员。
iValuelValuedValue都占用相同的空间。

一旦您写入dValueiValuelValue成员将不再可用:仅dValue可用。

编辑:要解决以下注释:您不能先写一个 union 的数据成员,然后再从另一个数据成员读取。这样做会导致未定义的行为。 (有一个重要的异常(exception):您可以将C和C++中的任何对象都重新解释为char数组。还有其他一些小的异常(exception),例如能够将有符号整数重新解释为无符号整数。)您可以在C语言中找到更多内容标准(C99 6.5/6-7)和C++标准(C++ 03 3.10,如果我没记错的话)。

有时在实践中可能会执行此“工作”吗?是。但是,除非您的编译器明确声明可以保证这种重新解释正确地工作并且指定了它保证的行为,否则您将不能依赖它。

09-06 19:43