联盟:奇怪的行为[E]

时间:2013-07-26 13:57:44

标签: c unions

据说:“联合是一种特殊的类型,一次只能容纳一个非静态数据成员。”({{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;
}

输出为OUTPUT

2 个答案:

答案 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 的所有成员共享相同的内存。因此,如果您更改一个成员,那么其他成员也将更改。但是,分配给一个成员,然后访问另一个成员可能不会产生您期望的结果,因为内存中的布局通常是不同的。这是intdouble的情况,不能用作另一种情况。

您要找的是structure

struct number
{
    int x;
    double y;
};

上面包含两个单独的成员,它们可以同时使用,因为它们不再共享相同的内存。