使用union型別出現的程式結果不確定問題

2021-05-22 07:51:51 字數 1547 閱讀 7809

剛從論壇上看到乙個問題:

#include

int main(void)

r;r.i[0]=0;

r.i[1]=2;

printf("%d /n", r.k);  //沒有賦值所以值是不確定的

return 0;

}程式結果是什麼?

這裡簡單解釋一下:

由於union型別是共享記憶體,也就是說字元陣列i和int型別變數k共享這一記憶體的資料,因此同一時刻只能有乙個變數有意義。

union型別變數r的大小是按其成員的最大記憶體長度分配的。根據編譯器和機器位數的不同,上述程式會出現不同的結果:

(1)如果編譯器對union型初始化預設為0,i中的i[0]和i[1]是按記憶體從低到高的順序分配的。因此i要占用r的低位2個位元組。

int型長度是16或32,即4個位元組或8個位元組,且,則上述r中記憶體的二進位制形式為:

高位------------------------------------------------低位(16位)

00000000  00000000  00000010 00000000

r.i[1]             r.i[0]

|--------------------------r.k------------------------------|

因此r.k=2^9=512;

(2)如果編譯器對union型初始化沒有預設值,i中的i[0]和i[1]是按記憶體從低到高的順序分配的(i要占用r的低位2個位元組),例如vc++6.0中,將r.k以以下16進製制輸出:

printf("%x/n",r.k);

輸出結果為:-859045376(十進位制輸出)

cccc0200(16進製制輸出)

可以看出:乙個16進製制位=4個二進位制位,2個16進製制位=1個位元組,這裡輸出了4個位元組,說明int型為32位的:

高位-----------------低位(16進製制)

cc        cc         02       00

r.i[1]      r.i[0]

|--------------------------r.k------------------------------|

char i初始化時覆蓋了記憶體的低位2個位元組,但由於r初始化時記憶體沒有預設為0,且r.k也沒有初始化,因此其2個位元組的高位數值是不確定的。

如果修改為以下程式:

#include

int main(void)

r;r.k=0;  //先通過初始化r.k將union型變數r的記憶體清零

r.i[0]=0;

r.i[1]=2;

printf("%d /n", r.k);  //沒有賦值所以值是不確定的

printf("%x/n",r.k);

return 0;

}其結果為:

512  (十進位制)

200   (十六進製制)

可見,上述程式的結果其實與編譯器對資料型別的預設初始化與資料在機器記憶體中的分配順序(從低到高分配還是從高到低分配)是有關的。

hive中union出現的型別問題

錯誤資訊 failed semanticexception schema of both sides of union should match column create date is of type string on first table and type date on second t...

C語言中Union型別的使用方法

使用c語言時,常常使用struct,對於union型別卻幾乎沒有用過,只知道它是聯合型別,各欄位共享一塊記憶體,實際應用中卻不知道它的具體用途。今天讀 程式設計卓越之道 中看到有對其使用的簡單介紹,記錄在此 首先摘錄一下struct和union的重要區別 struct為每個欄位在不同的偏移處分配儲存...

C語言中Union型別的使用方法

使用c語言時,常常使用struct,對於union型別卻幾乎沒有用過,只知道它是聯合型別,各欄位共享一塊記憶體,實際應用中卻不知道它的具體用途。今天讀 程式設計卓越之道 中看到有對其使用的簡單介紹,記錄在此 首先摘錄一下struct和union的重要區別 struct為每個欄位在不同的偏移處分配儲存...