C编程:联合

C编程:联合,c,unions,C,Unions,此程序将输出显示为 031 在DEVC++中进行测试。可能 031 不能是垃圾值。请告诉我。您正在显示单元化数据。根据任何定义,它都是垃圾-可能是运行时链接后的一些剩余内容。首先,让我告诉您,当使用%d作为参数时,您需要访问联合体的成员(typeint),您不能传递联合体本身。在它的当前状态下,任何符合条件的编译器都会尝试用如下消息警告您 格式“%d”要求参数类型为“int”,但参数3的类型为“union status”[-Wformat=] 因为,传递不兼容类型的参数会导致 之后,关于您看到的

此程序将输出显示为

031

在DEVC++中进行测试。可能

031


不能是垃圾值。请告诉我。

您正在显示单元化数据。根据任何定义,它都是垃圾-可能是运行时链接后的一些剩余内容。

首先,让我告诉您,当使用
%d
作为参数时,您需要访问联合体的成员(type
int
),您不能传递联合体本身。在它的当前状态下,任何符合条件的编译器都会尝试用如下消息警告您

格式“%d”要求参数类型为“int”,但参数3的类型为“union status”[-Wformat=]

因为,传递不兼容类型的参数会导致

之后,关于您看到的值,它是不确定值。您不可能有任何特定的输出

在您的例子中,
std1
std2
std3
都是自动局部变量,除非显式初始化,否则它们包含不确定的值。引用第§6.7.9章C11

如果没有显式初始化具有自动存储持续时间的对象,则其值为 不确定的[……]

从逻辑上考虑,你从来没有把任何东西放在这里,你希望得到什么


这就是说,这会导致,因为类型可能具有陷阱表示,并且地址从未被获取,因此使用该值会调用UB。

未初始化的变量具有不确定的值-只是不知道其值是什么。变量背后有一个有效的内存地址,它有一些垃圾内容。

请注意,即使正确完成了初始化,这也是UB(未定义的行为)@蓝精灵是垃圾!尝试跨不同的编译器编译它。
std1
不是int。使用
%d
打印它是未定义的行为[请注意,@LưuVĩnhPhúc提到的非常有效的一点。使用set
-Wall
选项对编译器选项进行编译我认为会有类似枚举的东西…
%s/未指定/不确定的
所以在实践中,在任何合理的实现中,这种代码可能永远不会崩溃
…嗯,它可以,sid之一UB的影响。请看我的答案。请注意,它是UB,即使初始化正确完成。我想知道你为什么提到实际原因(传递错误的类型)更像是一个子问题。我会集中讨论这个问题,并提到缺少初始化器是第二个问题。两个问题都调用UB,顺便说一句。对于类型不匹配问题,您肯定应该强调这一点!我也同意Olaf。这是唯一正确的答案。
main()
{
    union status {
        int a;
        int b;
        int c;
    };
    union status std1, std2, std3;
    printf("%d %d %d\n", std1, std2, std3);
    return 0;
}