为什么以下C代码输出1?

时间:2017-10-27 14:16:15

标签: c

#include <stdio.h>
union p
{
    int x;
    char y;
} k = {1, 97};
int main()
{
    printf("%d\n", k.y);
}

这是代码。当我用67输出替换那个97是1.如何打印1

4 个答案:

答案 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)

因为它是一个联合,只需要一个初始化值。第二个被忽略了。