C联盟输出不清楚

时间:2016-06-05 18:41:25

标签: c unions

我在理解工会及其运作方式方面遇到了一些麻烦。

#include <stdio.h>

union date {
    int year;
    char month;
    char day;
};

int main() {
    union date birth;
    birth.year = 1984;
    birth.month = 7;
    birth.day = 28;
    printf("%d, %d, %d\n", birth.year, birth.month, birth.day);
    return 0;
}

因为它是一个联盟,它会给我4个字节,因为int是这个联合中给出的最高类型。这是我从阅读中获得的全部内容,我不知道为什么输出是

1820, 28, 28

2 个答案:

答案 0 :(得分:5)

C中的联合对联合中定义的变量使用相同的内存分配。因此,总分配等于需要最大内存区域的变量的大小。

在你的情况下,int(4字节),char,char(1字节)。整个联合对象的总内存分配是4个字节。

4bytes = _ _,_ _,_ _,_ _(内存位置表示)

分配到1984年= 0x000007c0 (首次分配后的记忆)

对月份的分配将使用相同的位置= 0x00000707 (仅更改1个字节)

分配到第28天(0x1c)= 0x0000071c (最终记忆状态)

现在获得一天(1byte)= 0x1c (28)

获得月份(1byte)= 0x1c (28)

获得年份(4byte)= 0x0000071 c(1820)

这是整个故事。

答案 1 :(得分:-1)

这是4个字节,但是当月和当天一样。你存放的最后一件事,那一天,破坏了一年中和一年中的任何东西。 您无法以原始状态访问所有三个成员。您只能选择一个,即您存储的最后一个。