2015-04-19 74 views
0

對於下面的程序int用垃圾值打印,但預期是初始化值50,在輸出中是否有任何特定的原因導致該值?爲什麼在聯合整數的垃圾值?

#include <stdio.h> 
#include <string.h> 

union data 
{ 
    int a; 
    float c; 
    char b[10]; 
}; 

int main() 
{ 
    union data x; 
    x.a = 50; 
    strcpy(x.b,"hello"); 
    x.c = 21.50; 
    printf ("x.a:= %d\n",x.a); 
    printf ("x.b:= %s\n",x.b); 
    printf ("x.c:= %f\n",x.c); 
    return 0; 
} 

輸出:

x.a:= 1101791232 
x.b:= 
x.c:= 21.500000 

更新:對於下面的一切,提到類似的計劃做工精細,我沒有線索如何能產生預期的效果

#include <stdio.h> 
#include <string.h> 

union Data 
{ 
    int i; 
    float f; 
    char str[20]; 
}; 

int main() 
{ 
    union Data data;   

    data.i = 10; 
    printf("data.i : %d\n", data.i); 

    data.f = 220.5; 
    printf("data.f : %f\n", data.f); 

    strcpy(data.str, "C Programming"); 
    printf("data.str : %s\n", data.str); 

    return 0; 
} 

輸出:

data.i : 10 
data.f : 220.500000 
data.str : C Programming 
+0

您可以在聯盟中只存儲一個值。 – ligoore

+0

而不是'union',你的意思是使用'struct'嗎? –

+0

@ligoore你可以在問題中輸入你對第二個程序的評論嗎? – Emman

回答

4

聯盟將爲其所有成員使用相同的存儲位置。您設置了x.a,但是當您設置x.c時,它也會覆蓋x.a的存儲位置。

在二進制中,整數值1101791232是一樣的浮點值22.50,你可以很容易地驗證:

float f = 21.50; 
    int * iP = (int*)&f; 
    cout << *iP; 

工會的數據看起來在內存中是這樣(每個X是一個字節) :

XXXXXXXXXX <- union data 
XXXX  <- int a 
XXXX  <- float c 
XXXXXXXXXX <- char b[10] 

因此寫入a或c會覆蓋另一個,再加上char數組的前4個元素。

至於你的第二個例子,嘗試設置三個成員,然後只輸出他們的值,他們將再次垃圾。它僅適用於您在設置之後和覆蓋之前立即輸出。

+0

明白了。是的,如果最後打印出來,轉換就會發生。 – Emman

4

工會的重點是設置一個值覆蓋所有其他值。

你在工會設定的最後一件事是c=21.50。 a的值將會是21.50的位,就好像它們表示一個int。

21.50的值是0x41ac0000(見float to hex converter),其澆鑄到int恰好是 1101791232(見hex to decimal converter)。