C 联盟产出不明
C Unions output unclear
我在理解联合及其运作方式时遇到了一些麻烦。
#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
它是 4 个字节,但月份和日期一样位于年份之上。您存储的最后一件事,即日期,破坏了月份和年份的所有内容。
您无法访问原始状态下的所有三个成员。您只能选择一个,您存储的最后一个。
C 中的联合对联合中定义的变量使用相同的内存分配。因此,总分配等于需要最大内存区域的变量的大小。
在你的例子中,int(4 字节)、char、char(1 字节)。整个联合对象的总内存分配为 4 个字节。
4bytes = _ _, _ _, _ _, _ _(内存位置表示)
分配到 1984 年 = 0x000007c0(第一次分配后的内存)
分配给月份将使用相同的位置 = 0x00000707(仅更改 1 个字节)
分配给第 28 天 (0x1c) = 0x0000071c(最终内存状态)
现在得到天(1byte) = 0x1c (28)
获取月份(1byte)= 0x1c (28)
获取年份(4byte)=0x0000071c (1820)
这就是整个故事。
我在理解联合及其运作方式时遇到了一些麻烦。
#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
它是 4 个字节,但月份和日期一样位于年份之上。您存储的最后一件事,即日期,破坏了月份和年份的所有内容。 您无法访问原始状态下的所有三个成员。您只能选择一个,您存储的最后一个。
C 中的联合对联合中定义的变量使用相同的内存分配。因此,总分配等于需要最大内存区域的变量的大小。
在你的例子中,int(4 字节)、char、char(1 字节)。整个联合对象的总内存分配为 4 个字节。
4bytes = _ _, _ _, _ _, _ _(内存位置表示)
分配到 1984 年 = 0x000007c0(第一次分配后的内存)
分配给月份将使用相同的位置 = 0x00000707(仅更改 1 个字节)
分配给第 28 天 (0x1c) = 0x0000071c(最终内存状态)
现在得到天(1byte) = 0x1c (28)
获取月份(1byte)= 0x1c (28)
获取年份(4byte)=0x0000071c (1820)
这就是整个故事。