带有打印联合值的怪癖

Ian*_*ley 5 c printf unions

以下代码导致:

0.000000

10

在这种情况下,“数据”返回了什么?我知道n.data.idata并且n.data.fdata将是正确的用法,我只是好奇为什么整数值在这种情况下有效而浮点值却不起作用

#include<stdio.h>
#include<stdlib.h>

typedef struct node
{
    union container
    {
        int idata;
        float fdata;
    } data;
    struct node *next;
} Node;

int main()
{
    Node i = {.data.idata = 10};
    Node n = {.data.fdata = 10.0};
    printf("%f\n", n.data);
    printf("%d\n", i.data);

    printf("\nExiting program...\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

250*_*501 5

让我们暂时忽略明显的未定义行为,这是因为将不正确的类型传递给了specifier的printf函数f。该类型是匿名联合。

说明符f假定默认的参数提升从float到double,在这种情况下不会发生这种情况,因为将联合data传递给了函数。因此,该函数接收data由4个字节组成的并表示一个浮点数的并集,但尝试打印8个字节,因为它期望一个双精度数。结果是一个无意义的值,在您的情况下为0.0。

(此答案假定IEEE 754,并且sizeof(int)<= 4)