為了計算結構體大小,需要知道各個基本資料型別的大小:
資料型別
char
short
intlong
float
double
指標大小12
4448
根據編譯器
指標在x86下為4個位元組,在x64下為8個位元組。
結構體大小計算的規則:
第乙個成員在與結構體變數偏移量為0的位址處。
其他成員變數要對齊到某個數字(對齊數)的整數倍的位址處。對齊數=編譯器預設的乙個對齊數與該成員大小的較小值,在vs環境下預設值為8,在linux環境下預設值為4。結構體的總大小為最大對齊數(每個成員變數都有乙個對齊數)的整數倍。如果巢狀了結構體的情況,被巢狀的結構體對齊到其自身對齊數的整數倍處(結構體的對齊數就是其內部成員中最大的對齊數),此時結構體的整體大小就是所有最大對齊數(含被巢狀結構體的對齊數)的整數倍。
通過乙個例子說明:
#include
intmain
(void)a;
printf
("%d\n"
,sizeof
(a))
;return0;
}
我一開始的思路:結構體中共有4個成員,4(int)+8(double)+3(char)+4(long) = 19,答案是19!!!
事實證明,這個答案是錯誤的。
我沒有考慮到偏移量這個概念。看一下每個成員的偏移量:成員a
bcd偏移量04
1215
在計算偏移量時,需要明確對齊數的概念。對齊數 = 編譯器預設的乙個對齊數與該成員大小的較小值,我在vs下編譯,所以預設對齊數字8,成員d是long型,大小為4位元組,因此d的對齊數為4,偏移量應當為4的倍數,後移1bit正好是16,16是4的整數倍,因此d的偏移量應為16。成員a
bcd偏移量04
1216
好了,d後移了一位,所以結構體大小是20!!!
事實證明,又錯了。
我沒有考慮到結構體大小應是最大對齊數的整數倍。成員a
bcd對齊數–8
14注意:這裡c雖然是乙個char型陣列,但計算對齊數時還是按照char來計算的。
這個結構體的最大對齊數為8,20不是8的整數倍,後移,24是8的整數倍,因此這個結構體的大小應該是24!!!
執行一下:
正確!!!
再試乙個例子:
#include
intmain
(void)a;
printf
("%d\n"
,sizeof
(a))
;return0;
}
按照上述規則,先求各成員的對齊數:成員a
bcd對齊數–4
14然後考慮成員的偏移量:成員a
bcd偏移量04
816這個結構體的最大對齊數為4,20正好是4的整數倍,因此這個結構體的大小為20。
參考:
結構體大小 C語言
記憶體對齊 各種資料存放的位址要能夠整除該資料本身的位元組數 char可存放在任意位址,short存放在能被2整除的位址,int存放在能被4整除的位址 1 先將每個成員的位元組數寫出,然後從第二個成員開始,將前面成員的總位元組數補齊成當前位元組數的倍數 2 結構體的總大小,一定要能整除單個成員最大型...
C語言 計算結構體大小
結構體中的成員可以是不同的資料型別,成員按照定義時間的順序依次儲存在連續的記憶體空間。和陣列不一樣的是,結構體的大小不是所有成員大小簡單的相加,需要考慮到系統在儲存結構體變數時的位址對其問題。結構體對齊規則 通入下面例題,計算結構體大小 題1 struct s1 題2 struct s2 題3 st...
C語言中的結構體大小
現代計算機中,記憶體空間按照位元組劃分,理論上可以從任何起始位址訪問任意型別的變數。但實際中在訪問特定型別變數時經常在特定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序乙個接乙個地存放,這就是對齊。不同硬體平台對儲存空間的處理上存在很大的不同。某些平台對特定型別的資料只...