#include <stdio.h>
union p
{
int x;
char y;
} k = {1, 97};
int main()
{
printf("%d\n", k.y);
}
这是代码。当我用67输出替换那个97是1.如何打印1
?
答案 0 :(得分:7)
您的编译器实际上应该警告您“过度初始化程序”或类似的东西。尝试启用更多警告(gcc
/ clang
的个人推荐:-std=c11 -Wall -Wextra -pedantic
)。
使用union
,初始值设定项(不带指示符)始终初始化第一个联合成员。你不能让union
的多个成员同时拥有一个值,它们都共享相同的内存,所以初始化多个没有意义。如果你使用指示符,最后一个“赢”。
您的编译器只删除97
并使用1
初始化p.x
。这不保证阅读p.y
会给你1
,但在小端机器上,这将会发生。
答案 1 :(得分:3)
因为除union
之外的struct
覆盖其成员。初始化两个成员是没有意义的。
答案 2 :(得分:1)
您的程序未定义 - 您只能初始化一个union的成员,因为所有成员占用都存储在同一地址。我很惊讶您的C编译器没有对此感到兴奋,您是否禁用了警告?一旦你跳入未定义,就无法知道编译器会做什么。
答案 3 :(得分:1)
因为它是一个联合,只需要一个初始化值。第二个被忽略了。