据说:“union 是一种特殊的类类型,一次只能保存一个它的非静态数据成员。”(http://en.cppreference.com/w/cpp/language/union )
但它怎么能容纳不止一个成员呢?
y
为 8 个字节,x
为 4 个字节。 union 的大小是 MAX 元素的大小(8 字节)。它不能容纳 4 + 8 = 12 个字节...
我很困惑。
#include <stdio.h>
#include <stdlib.h>
union number {
int x;
double y;
};
int main()
{
union number value;
// ok
value.x = 1;
printf("\n int: %5d\ndouble: %f\n", value.x, value.y);
// ok
value.y = 1.0;
printf("\n int: %5d\ndouble: %f\n", value.x, value.y);
// NOT OK! But if I swap `value.x and value.y` it will work properly...
value.y = 1.0;
value.x = 1;
printf("\n int: %5d\ndouble: %f\n", value.x, value.y);
return 0;
}
输出是
最佳答案
union 为“最大”数据类型分配了足够的内存。
例如,如果 union 将包含 uint8_t a、uint16_t b。数据将对齐如下
Bits LSB 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 MSB
Uint8_t a -------------->
Uint16_t b ------------------------------------>
Var b= 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 in binary
如果你看一下 var a。它会给你二进制 00000001,十进制 128。 ` 好吧,我不知道我现在是不是更让你困惑了:)。
关于c - 联盟 : strange behavior [c],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17883304/