English Deutsch Français Italiano Español Português 繁體中文 Bahasa Indonesia Tiếng Việt ภาษาไทย
所有分類

舉個例子:
struct st_test
{
int a;
char b;
long c;
}

union un_test
{
int a;
char b;
long c;
}
當你宣告一個st_test時,實際上是有三個變數,
也就是int a,char b,long c;
所佔的記憶體空間是7個bytes(假設int是2個bytes,long是4個bytes);

當你宣告一個un_test時,實際上是只有一個變數,
也就是int a;
所佔的記憶體空間是4個bytes(假設int是2個bytes,long是4個bytes);
那麼a跟b呢?
a就是c的前兩個bytes,b就是c的第一個byte,
引用
:http://tw.knowledge.yahoo.com/question/question?qid=1507083104237

union那個沒問題
可是struct用sizeof()輸出是12而不是7為什麼??
請詳細的解釋一下~感謝^_^

2007-12-08 11:05:20 · 3 個解答 · 發問者 Alexis 3 in 電腦與網際網路 程式設計

綿羊大大ˊˇˋ你是不是沒聽懂我在問啥壓~小弟有可能表達不好
小弟的程式在下面:

2007-12-08 12:13:13 · update #1

int main()
{
union un_test
{
int a;
char b;
long c;
};
union un_test un_data;
struct st_test
{
int a;
char b;
long c;
};
struct st_test st_data;
printf("%d\n",sizeof(un_data));
printf("%d\n",sizeof(st_data));
system("pause");
return 0;
}

2007-12-08 12:13:25 · update #2

http://tw.knowledge.yahoo.com/question/question?qid=1507083104237
參考這網址低大大血滴~輸出因該是7才對~位什麼事12>""<+
之前我ㄇ老師有說過~我忘ㄌ=口=|||
人老ㄌ記性不好OTZ

2007-12-08 12:15:03 · update #3

union un2 {
int x;==>4 byte
char z[5];5 byte
};
可是因為一般個人電腦的開發環境都是用4 bytes做為單位
所以變 8
若改為struct呢?
4+5=9
取最近12
對不?>""<+

2007-12-08 16:08:15 · update #4

3 個解答

首先來說明struct
發問的朋友對struct的理解是正確的,參考的網頁也沒錯,只是忽略了兩個小問題。

(1)在現代32位元的電腦中int和long都是4 bytes。參考網頁所說的int是2個bytes、long是4個bytes在其他16位元的環境比較常見。

所以sizeof(int)+sizeof(char)+sizeof(long) 在32位元的環境下應該是9,在16位元的環境下可能為7。但為何會跑出12,請看下面解說

(2)為了定址方便的關係,struct的大小通常會是某個定址單位的整數倍,一般個人電腦的開發環境都是用4 bytes做為單位。能容納下9 bytes又為4的整數倍,最接近的就是12了。由此可以看出,儘管char有效的資料只有1byte,但內部儲存時仍然會多浪費3 bytes無使用的空間。

上面所說的單位並不是固定的,大多數的程式開發環境都允許使用者修改,這樣可以針對空間最佳化,並且確保資料在不同程式之間轉移時能被正確的解讀,但是如此一來有可能會影響資料定址的速度


再來是union
union是所有的變數共用同一個記憶體,因此的大小必須大於最大的一個變數,例如你程式碼中的un_test至少需要4 Bytes才放得下long和int。

和struct一樣,union的大小也必須是某個定址單位的整數倍,常見的開發環境中為4 bytes。和小綿羊說的不同,struct 與 union 兩種語法對現在的電腦來說,在使用記憶體的容量而言,還是很不一樣。




2007-12-08 18:56:24 補充:
>>這兩者都是結構,union 是 struct 的最佳化.....
>>.....所以 struct 與 union 兩種語法對現在的電腦來說,在使用記憶體的容量而言,完全沒有差別。
^^^^^^^^^^^^^^^^
對union的說法嚴重錯誤!!若不懂請勿亂回答,以免誤導網友

2007-12-08 19:02:25 補充:
丟一個小問題給您

去試一下
union un2 {
int x;
char z[5];
};
的大小應該為多少?若改為struct呢?

2007-12-08 13:55:23 · answer #1 · answered by novus 6 · 0 0

謝謝novus指教,受益不少,
也謝謝I want Fly提出問題,
讓我可以學習到這些。

2007-12-08 15:35:57 · answer #2 · answered by Phoenix 5 · 0 0

這兩者都是結構,union 是 struct 的最佳化

結構是一連串的記憶體空間,對 struct 來說,由於 int 轉換到 char 的資料型態轉換上,必須浪費一部分的記憶體空間,才可以儲存下一個不同資料型態的資料。

以前使用 16 位元的電腦編寫程式時,由於軟體發展的過程,程式所需記憶體的容量是越來越大,必需考慮到記憶體的使用容量,所以才會出現 union 這種 struct 結構的最佳化語法。

對現在的記憶體而言,2 G 的大小不到三千元新台幣,所以 struct 與 union 兩種語法對現在的電腦來說,在使用記憶體的容量而言,完全沒有差別。

2007-12-08 11:31:04 · answer #3 · answered by Big_John-tw 7 · 0 0

fedest.com, questions and answers