分配和获取联合值,键入punning

时间:2013-04-19 15:16:27

标签: c gcc unions type-punning

我有一个工会,好的。
这个联合在一个结构中,并且该联合是未命名的(某物)。

typedef enum TYPES {INT, FLOAT, CHAR, POINTER TO FUNCTION /* Please pay attention on this */};

typedef struct {
    TYPES type;
    union {
        int integer;
        float real;
        char letter;
        char *string;
        /* here we have a pointer to function syntax but I don't remember how to write it right now*/
    }
} MY_STRUCT;

我会像这样初始化我的结构。

MY_STRUCT test = {INT, 22};

好的,我知道这项工作,因为根据定义,当我使用这种初始化时,将使用联合的最第一个字段。
所以问题是:
如果我像这样编写初始化会发生什么?

MY_STRUCT test = {INT, 22.2};

当我尝试检索浮点值后,我会得到正确的值吗?

float var = (float)test.real;

这会显示正确的事吗?
这适用于所有类型吗?甚至指向函数的指针?

我问这个是因为根据定义,初始化将值放在我的union的第一个字段中,所以,如果float大于int,是否存在问题?我不知道这个,所以,我知道函数的指针,有时它可能比int大,所以我需要用指针编写我的联合作为第一个成员?

我读到GCC支持类型惩罚,甚至linux内核使用类型惩罚。 所以我只是害怕如果我可以在该结构上使用这种初始化,然后获得正确的值。

1 个答案:

答案 0 :(得分:0)

union的元素共享内存空间,整个联合使用“bigest”元素所需的空间。 当你初始化22.2。这代表了 01000001101100011001100110011010 使用fpoint IEEE 754.它取决于精度。 和你的

float var=(float) test.real
只有当你没有改变初始化和这一行之间的任何联合元素时,

才会起作用。