我的代码是这样
// 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
时,为什么会得到垃圾值?我认为内存布局将类似于this。
Values.iValue
和会发生什么我为
Values.lValue;
分配内容时的Values.dValue
吗? 最佳答案
在union
中,所有数据成员都重叠。您一次只能使用一个 union 的数据成员。iValue
,lValue
和dValue
都占用相同的空间。
一旦您写入dValue
,iValue
和lValue
成员将不再可用:仅dValue
可用。
编辑:要解决以下注释:您不能先写一个 union 的数据成员,然后再从另一个数据成员读取。这样做会导致未定义的行为。 (有一个重要的异常(exception):您可以将C和C++中的任何对象都重新解释为char
数组。还有其他一些小的异常(exception),例如能够将有符号整数重新解释为无符号整数。)您可以在C语言中找到更多内容标准(C99 6.5/6-7)和C++标准(C++ 03 3.10,如果我没记错的话)。
有时在实践中可能会执行此“工作”吗?是。但是,除非您的编译器明确声明可以保证这种重新解释正确地工作并且指定了它保证的行为,否则您将不能依赖它。