我有这段代码
union u_value {
int i_value;
long l_value;
float f_value;
double d_value;
char *cp_value;
int type;
};
union u_value create_int_value(int value) {
union u_value val;
val.i_value = value;
val.type = INT;
printf("Inside: %d, %d\n", value, val.i_value);
return val;
}
问题在于我无法在联盟中设置值。
例如:
union u_value val = create_int_value(123);
printf("%d\n", val.i_value);
将打印0
我做错了什么?
答案 0 :(得分:4)
您已将type
成员指定为联合的一部分,这当然会导致其内存与其他字段发生冲突。
要创建"tagged union",您必须将标记与联合分开。类似的东西:
struct u_value {
int type;
union {
int i_value;
long l_value;
float f_value;
double d_value;
char *cp_value;
} value;
};
然后你可以使用:
u_value x;
x.type = INT;
x.value.i_value = 4711;
从C11开始,您可以使内部union
匿名,这很方便。
答案 1 :(得分:1)
我猜,INT
定义为0 ..?您首先将i_value
设置为123,然后设置type
,因为它是一个联盟正在覆盖i_value
。
您需要做的是将联盟中的类型拆分
union u_value
{
int i_value;
long l_value;
float f_value;
double d_value;
char *cp_value;
};
struct my_type
{
union u_value value;
int type;
};
struct my_type create_int_value(int value) {
struct my_type val;
val.value.i_value = value;
val.type = INT;
printf("Inside: %d, %d\n", value, val.value.i_value);
return val;
}
现在该类型不会覆盖该值。