C語言中結構體長度計算

2021-10-01 16:18:58 字數 797 閱讀 8780

結構體的長度並不是簡單地將結構體地所有成員相加

它中間會出現偏移量,我們以下為例

現有如下結構體:

struct good

我們假設初始位址開始為0

c的長度為1,0可以整除1,當c填充到記憶體後位址加1,即此時到了位址為1的位置

id的長度為4,位址位置1不可以整除4,所以在c填充到記憶體時需要加3,我們可以理解為c後面有3個空位,當id填充到記憶體後位址位置為8

g的長度為1,位址位置8可以整除1,當g填充到記憶體後位址加1,即位址位置為9

shop的長度為4,9不可以整除4,所以g的後面需要有3個空位,當shop填充到記憶體後位址為16

price的長度為8,16可以整除8,直接將其新增到記憶體中,此時位址為24

num的長度為4,24可以整除4,直接將其新增到記憶體中,此時位址為28

rec字串我們可以理解為50個char的字元,因為char字元的長度為1,能被任何數整除,所以直接將其新增到記憶體中,此時位址為78

最後我們需要加上乙個值,使最終這個結果能整除結構體最長成員的長度,在此結構體中最長成員的長度為8,即double型別(不是char rec[50],因為陣列是由多個相同型別組成的),所以最終的結果為80

好像也有說最終結果必須是所有成員的公倍數,不過c語言中所有型別滿足倍數關係,64位系統中如char(1),short(2),int(4),long long(8),float(4),double(8)。所以我們直接找長度最大的就可以了

這只是乙個求結構體長度的方式,僅供參考!

C 踩坑記錄 struct 結構體長度問題

下面的結構體總共11個位元組,但通過marshal.sizeof headdata 獲取到的是12個位元組 system.serializable public struct headdata 主要原因是 結構體出於效率原因,結構會被進行優化和對齊。如果對齊的邊界是2個位元組,那麼marshal.s...

用對齊原則求結構體長度

日期 2009 09 18 字型 大 中 小 1.熟悉win32下vc6.0各種基本資料長度 size of int is 4 size of char is 1 size of short int is 2 size of double is 8 size of unsigned int is 4...

C語言中結構體資料位元組長度問題

在複習c語言中結構體時,遇到如下問題。定義結構體 typedef struct studentstudent int main 試著去計算結構所佔記憶體空間的大小 在32位作業系統中,int 所佔4個位元組,char佔乙個位元組,那麼結構體中所佔資料位元組不應該是6個位元組大小嗎。因為在計算機中是按...