2

我有工会,好吧。
这个联合在一个结构内,并且那个联合是未命名的(类似的东西)。

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;

这会显示正确的东西吗?
这适用于每种类型吗?甚至指向功能一的指针?

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

我读到 GCC 支持类型双关,甚至 linux 内核也使用类型双关。所以我只担心我是否可以在该结构上使用这种初始化,然后获得正确的值。

4

1 回答 1

0

联合的元素共享内存空间,整个联合使用“最大”元素所需的空间。当你用 22.2 初始化时。这表示 01000001101100011001100110011010 使用 fpoint IEEE 754。这取决于精度。和你的

float var=(float) test.real

仅当您不更改初始化和此行之间的任何联合元素时才有效。

于 2013-12-06T17:34:19.860 回答