用最簡單的方法,通俗易懂的方法計算結構體大小。
結構體計算要遵循位元組對齊原則。
結構體預設的位元組對齊一般滿足三個準則:
其實暫且不管這三原則,我的方法只要記住第三個,就是結構體大小結果要為成員中最大位元組的整數倍。先看下面定義的兩個結構體:
struct s1;分別用程式測試得出sizeof(s1)=6 , sizeof(s2)=4。struct s2;
注意: 為什麼 僅僅改變了結構體成員的順序,結果不一樣?
解:對於 s1 來說,順序是 char->short->char :
所以對於 s1 結構體大小為 2*3=6,至於為什麼第二個 char,多的那個位元組不丟到,就是遵循第三個原則,就是結構體大小結果要為成員中最大位元組的整數倍。
s1=2*3=6對於 s2 嘛,也畫個圖,但是順序是 char->char->short:
s2=2*2=4按照這個方法再看這樣的乙個結構體:
struct stu1很明顯,最大位元組為 4 個。順序 int char int:;
因為 int 佔 4 個,而 char 已經佔了乙個,不夠,所以那三個只能多餘佔位。
stu1=3*4=12那麼換一下呢?
struct stu2;
stu2=3*4=12再看乙個:就是當結構體成員變數是另外乙個結構體時,只要把結構體中成員為另一結構體作為整體相加就行。
typedef struct a而對於 b,先不要管 a a,也就是先去掉 a a 成員結構體 b 算出其為 8,所以最後結果為 8+16=24;24 才是最後結果。;a=16
typedef struct b
;
計算結構體大小
運算子sizeof可以計算出給定型別的大小,對於32位系統來說,sizeof char 1 sizeof int 4。基本資料型別的大小很好計算,我們來看一下如何計算構造資料型別的大小。c語言中的構造資料型別有三種 陣列 結構體和共用體。陣列是相同型別的元素的集合,只要會計算單個元素的大小,整個陣列...
計算結構體大小
include include include define uint32 unsigned int define uint16 unsigned short define uint8 unsigned char define bool unsigned char 位元組型別列舉 enum type...
結構體大小的計算
位元組對齊原則 結構體預設的位元組對齊一般滿足三個準則 1 結構體變數的首位址能夠被其最寬基本型別成員的大小所整除 2 結構體每個成員相對於結構體首位址的偏移量 offset 都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充位元組 internal adding 3 結構體的總大小為結構體最...