如何計算結構體及共用體大小

2022-07-25 17:57:07 字數 2311 閱讀 5628

如何計算結構體及共用體大小

(宣告:以下均為我乙個字乙個字打上去的,**於大一上學期所作筆記) 對於結構體 首先理解位元組對齊機制: (1

),結構體變數的首位址能夠被其最寬基本型別成員大小所整除。 (2

),結構體每個成員相對於結構體首位址的偏移量(

offset

)都是該成員大小的整數倍,如有需要,編譯器會在成員之間加上中間填充位元組。 (3

)結構體總大小為結構體最寬基本型別成員大小的整數倍,如有需要,編譯器會在最末乙個成員之後加上末尾填充位元組。 第(2

)、(3

)條準則決定了結構體變數佔據記憶體空間的大小。 基本型別指:char

,short

,int

,float

,double

。 資料寬度即其sizeof

的大小。

eg:struct a,structb; 則sizeof(a)=?,sizeof(b)=? 解:a

中,char佔1

位元組,short佔2

,則short

相對於結構體首位址的

offset

(偏移量)

=1,為滿足準則(

2),必須新增中間填充位元組1;

float佔4

位元組,相對於結構體首位址

offset

=(1+1+2)即4

,滿足準則(

2)。此時結構體大小為(

1+1+2+4)=8

,是最寬基本型別

float

整數倍,滿足(

3)。所以可得出:

sizeof(a)=8;

對於b:b中,

char佔1

,float佔4

,則float

相對於結構體首位址的

offset

=1,為滿足準則(

2),必須新增中間填充位元組3;

short佔2

,相對於結構體首位址

offset=(1+3+4)即8

,是short

所佔位元組的整數倍,滿足準則(

2)。此時結構體大小為(

1+3+4+2

)=10

,不是最寬基本型別

float

的整數倍,這時,末尾必須新增末尾填充位元組

2,所以最後總大小為12;

總結:分析時只要這樣即可: 對於a

:1 1 2   4 

(紅色為插入部分,寫時,中間要留夠空格) 對於b

:1 3 4   2 2 這樣就可以直觀的得到結構體大小。

遷移eg

:structc; 

則sizeof(c)=?(

答案:12)

知識擴充套件1

:若出現結構體巢狀,則準則(

2)、(

3)應改為: (2

),復合成員相對於結構體首位址的偏移量是復合成員中最寬基本型別成員大小的整數倍。 (3

),結構體總大小為結構體最寬基本型別成員大小整數倍。 eg: struct a }b; 則sizeof(b)=? 解:先計算a

大小:8

4 4 

8   1 

7(紅色為插入部分),得到為

32; 所以對於b

,一開始排列為: 

4 1 8 32

; 1的

offset=4

,所以4與1

間要添上

3。變為: 4 3 1   8   32; 此時8

的offset=8

,滿足準則2,

32的offset=16,是a

中最寬基本型別

double

所佔位元組的整數倍,滿足準則

2;此時

b大小為

48,是

b中最寬基本型別

double

的整數倍,滿足準則

3.所以最後

sizeof(b)=48;

知識擴充套件2

,若結構體內部出現陣列,則準則

2應為: (2

),陣列相對於結構體首位址的

offset

是該陣列成員大小的整數倍。 eg :struct c; 則

sizeof(c)=? 解:double

大小為8

位元組,所以

double[2]為16

;而指標大小均為

4, 所以c

可排列為: 16    44 得到sizeof(c)=24;

對於共用體: 原則上,共用體大小取決於佔據最多記憶體的成員的長度。但位元組對齊準則(3

)仍然成立。

eg: union e; 則sizeof(e)=16;

結構體 共用體

結構體 結構體的定義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.結構體陣列 方法和結構變數相...