我有一个工会,好的。
这个联合在一个结构中,并且该联合是未命名的(某物)。
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内核使用类型惩罚。 所以我只是害怕如果我可以在该结构上使用这种初始化,然后获得正确的值。
答案 0 :(得分:0)
union的元素共享内存空间,整个联合使用“bigest”元素所需的空间。 当你初始化22.2。这代表了 01000001101100011001100110011010 使用fpoint IEEE 754.它取决于精度。 和你的
float var=(float) test.real
只有当你没有改变初始化和这一行之间的任何联合元素时,才会起作用。