据说:“联合是一种特殊的类型,一次只能容纳一个非静态数据成员。”({{3 }})
但它怎么能容纳更多的一个成员?
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;
}
输出为
答案 0 :(得分:2)
联盟为&#34;最大的&#34;分配足够的内存。数据类型。
例如,如果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十进制给你。 ` 好吧,我不知道我现在更加困惑你了。)。
答案 1 :(得分:1)
联盟可以拥有任意数量的成员,但一次只能有一名成员有效。这是因为union 的所有成员共享相同的内存。因此,如果您更改一个成员,那么其他成员也将更改。但是,分配给一个成员,然后访问另一个成员可能不会产生您期望的结果,因为内存中的布局通常是不同的。这是int
和double
的情况,不能用作另一种情况。
您要找的是structure:
struct number
{
int x;
double y;
};
上面包含两个单独的成员,它们可以同时使用,因为它们不再共享相同的内存。