2014-10-29 70 views
-3

我有這樣的代碼無法設置工會值

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

我在做什麼錯?

+1

'type'本身就是工會的成員。設置它將覆蓋以前設置的任何值。如果你試圖實現一個帶標籤的聯合,你將需要一個'struct',其中一個成員是一個聯合,**另一個單獨的成員**是類型標籤。 – 2014-10-29 11:39:06

+0

@ TheParamagneticCroissant我不知道。謝謝!現在感覺很愚蠢 – ivknv 2014-10-29 11:41:21

+0

好吧,你不必*知道*任何特別的東西。爲什麼'type'字段是特殊的?它只是工會的另一個成員。它與所有其他成員共享存儲空間。你需要**瞭解**工會是什麼...... – 2014-10-29 11:42:08

回答

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匿名的,這是很方便的。

+0

大多數編譯器也會允許漂亮的匿名結構,所以你可以直接訪問'x.i_value' :) – Quentin 2014-10-29 11:43:12

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

拆分類型超出現在的類型不會覆蓋值。