c - 联盟 : strange behavior [c]

标签 c unions

据说:“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;
}

输出是OUTPUT

最佳答案

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/

相关文章:

c - "Segmentation fault (core dumped)"代表 : "No such file or directory" for libioP. h、printf-parse.h、vfprintf-internal.c 等

c - 如何使用 fork 和 execv 以编程方式启动预览?

c++ - 与位域的 union 为位域成员提供了意想不到的值(value)

php - Laravel 5 - 如何使用查询生成器或 Eloquent 在两个以上的表/查询中使用联合?

c - 无法从 int 值中提取字节数组值

c++ - 使用 C++11 无限制 union 时的 VS 2013 异常

c++ - 在两个任务之间使用互斥信号量

c - C 编译器如何知道数组的大小?

c - MPI 杀死不需要的进程

c - 是否使用 union 未定义行为访问结构上的特定数组索引?