關於結構體中有共用體成員時所佔記憶體容量的計算

2021-05-17 20:03:14 字數 992 閱讀 3080

今天碰到乙個面試題,題目如下:

#include

typedef union

data;

typedef struct

list;

int main()

當然不是原題,但形式差不多,當時我理解有誤,最初我是這樣理解的,首先看union,最大的應該是short b[5],它佔10個位元組,然後轉到struct中,long佔4個位元組,然後加10,再加1,總共15個位元組,但由於記憶體對齊的緣固,我答的是16,如果這樣理解就大錯特錯了,實際上應該這樣:

在union裡,double (8),short(2),char(1),在型別中以double最大,但是short是乙個陣列,加起來它的位元組就變為10了,本來如果沒有記憶體對齊的話,輸出為10也就對了,但是c語言偏有這個規定,所佔記憶體大小必須是最大型別(注意不是所佔的最大位元組數,一定要理解什麼是型別,陣列不是型別,只有int ,double,char 等才是)的整數倍,我們的最大型別是double(8),而10不是8的整數倍,所以應該輸出為16,然後再看struct,long(4),data(16),char(1),如果按我的思路,應該是4+16+1,再考慮對齊的話是24(我以long型別最大),又錯了,錯誤有兩點,在這裡不是long最大,還是double最大,二是c語言的另一規定,就是每個變數儲存時它的起始位址也必須是它型別的整數倍,也就是long以後,它的位址為4,但是union裡的double為8,它必須存到以8的位數開頭的位址上,這時候離它最近的就是位址8了,所以long儲存以後再後面又加了幾個空格一直到位址8為止,這時8+16+1=25最大型別還是為8,根據對齊,它應該輸出為32

所以答案就是16,32

我們為了驗證,還可以把union 中的double 型別注釋掉,這時結果為10,16;然後去掉注釋,把struct 中的char 注釋掉,這時結果為16,24,你能明白我這樣做的目的嗎,如果明白,那你就很精通這個了。

這是我第一次寫東西,比較粗糙,大家看不懂的地方多動手查查資料,只有自己多動手,才能變知識為技術,希望給大家一些收穫,謝謝。

結構體 共用體

結構體 結構體的定義1 struct mystruct 定義新變數 struct mystruct s1 結構體定義2 typedef struct mystruct mstrct 定義新變數 mstrct s1 結構體定義3 type struct mstrct 定義新變數 mstrct s1 共...

結構體 共用體 列舉

結構體 共用體 列舉 分析 首先宣告的結構體元素year的位址是最低的 0012ff74 而最後宣告的day的位址是最高的 0012ff7c 而我們又知道在棧中宣告變數的時候,位址是從高到低的分配的.因此,切記在結構體中宣告的變數與直接在外面宣告是不一樣的.在結構體中,最先宣告的變數放在最低位的.另...

結構體與共用體

1.定義乙個機構體的形式 struct 結構名 2.定義結構體變數 變數名表列 變數名表列 3.結構體成員的表示方法 結構變數名.成員名 例如 boy1.num 如果成員本身又是乙個結構則必須逐級找到最低階的成員才能使用。例如 boy1.birthday.month 4.結構體陣列 方法和結構變數相...