結構體是使用者建立由不同型別資料組成的組合型資料結構。
結構體的大小不是簡單地資料型別的相加,而是需要考慮到系統在儲存結構體變數時的位址對齊問題。
(1)結構體成員或者加上偏移量必須是下乙個成員大小的整數倍
(2)結構體大小必須是最大成員大小的整數倍
struct a
;//8
int型別佔4個位元組,剛好是float型別的整數倍,這個結構體就直接相加就可以了。
struct b
;//8
因為char型別只佔乙個位元組,int型別佔4個位元組,所以要偏移3個位元組才是int的倍數,所以總共是8個位元組
struct c
;//8
char型別佔乙個位元組,short佔兩個位元組,偏移量為1,相加為4,int型別佔4個位元組,4剛好是4的倍數,所以總共是8個位元組
struct d
;//10+2
char佔乙個位元組,偏移3個位元組,是int的整數倍,short佔兩個位元組,總共是10位元組,但是結構體總大小必須是最長型別大小的整數倍,所以再偏移兩個位元組,一共為12個位元組。
ps:struct c 和 srcuct d 儲存的型別都是int,short和char型別,但是乙個是8個位元組,乙個是12個位元組,這就需要使用者在定義時注意型別的排列問題,注意記憶體的使用空間。
struct ii
;//8
struct i
;//12
struct ii 的大小為8個位元組,struct i 的大小為float(4)加上struct ii 的大小(8)為12個位元組。之所以不是16個位元組是因為只需要遵循是最大單個型別的整數倍就可以了。
計算結構體大小
運算子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 結構體的總大小為結構體最...