无法设置联合值

时间:2014-10-29 11:36:43

标签: c unions

我有这段代码

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

我做错了什么?

2 个答案:

答案 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;
}

现在该类型不会覆盖该值。