1

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

输出是输出

4

2 回答 2

2

联合为“最大”数据类型分配足够的内存。

例如,如果联合将包含 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。` 哦,好吧,我不知道我现在是否让你更加困惑了:)。

于 2013-07-26T14:17:46.100 回答
1

工会可以拥有任意数量的成员,但一次只有一个成员有效。这是因为联合的所有成员共享相同的内存。所以如果你改变了一个成员,那么其他成员也会改变。但是,分配给一个成员,然后访问另一个成员可能不会产生您期望的结果,因为内存中的布局通常是不同的。这是 and 的情况intdouble一个不能用作另一个。

您正在寻找的是一个结构

struct number
{
    int x;
    double y;
};

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

于 2013-07-26T14:02:22.607 回答