[英]Why does the following C code output 1?
#include <stdio.h>
union p
{
int x;
char y;
} k = {1, 97};
int main()
{
printf("%d\n", k.y);
}
这是代码。 当我用67输出将97替换为1时,如何打印该1
?
您的编译器实际上应该警告您有关“过多的初始化程序”或类似内容的信息。 尝试启用更多警告(针对gcc
/ clang
个人建议: -std=c11 -Wall -Wextra -pedantic
)。
使用union
,初始化程序(没有指定符)总是初始化第一个union成员。 您不能让一个union
多个成员同时持有一个值,它们都共享相同的内存,因此初始化一个以上的对象是没有意义的。 如果您使用指示符,则最后一个“获胜”。
您的编译器仅删除97
并使用1
初始化px
。 这并不能保证读py
会给您1
,但是在小字节序的计算机上会发生这种情况。
因为除struct
之外的union
覆盖了其成员。 初始化两个成员都没有意义。
您的程序是未定义的-您只能初始化联合的一个成员,因为占用的所有成员都存储在同一地址。 令您惊讶的是,您的C编译器没有为此感到兴奋,您是否禁用了警告? 一旦跳入未定义状态,就不会告诉编译器将做什么。
因为它是一个并集,所以只需要一个初始化值。 第二个被忽略。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.