【问题标题】:Assigning and getting union values, type punning分配和获取联合值,类型双关语
【发布时间】:2013-04-13 01:00:30
【问题描述】:

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

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 内核也使用类型双关。 所以我只担心我是否可以在该结构上使用这种初始化,然后获得正确的值。

【问题讨论】:

    标签: c gcc unions type-punning


    【解决方案1】:

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

    float var=(float) test.real
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-16
      • 1970-01-01
      • 2020-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-02
      • 1970-01-01
      相关资源
      最近更新 更多