結構體的大小及結構體之位域

2021-08-26 20:35:55 字數 1136 閱讀 2238

結構體的大小:

規則1:結構體的大小等於結構體內最大型別的整數倍

規則3:為了滿足規則1和2在結構體成員之後進行位元組填充

結構體位域的大小規則:

共用體:

為了提速之類的,在結構體和聯合體的記憶體塊中,是按照一定的規則安排的

聯合體:

聯合體的記憶體不會為了所有成員安排,而是只取最大的成員的所需記憶體大小,每次只能使用其中乙個成員。但是有乙個問題:

typedef union

當然只取最大的int陣列的大小20沒錯,但是double是8位元組的,而此時聯合體已經按int的4位元組對齊了,所以還要額外多加4位元組的記憶體來保證8的倍數。所以最後結果是24

所以聯合體的記憶體除了取最大成員記憶體外,還要保證是所有成員型別size的最小公倍數

共用體大小:共用最寬的資料型別的空間大小

重點:無論是共用體還是結構體,都是最寬型別的整數倍

每個成員型別儲存起始位置都是按型別整數倍開始儲存的

如果共同體在結構體裡面時 結構體裡面含有共用體,共用體在結構體裡面的型別是它最大寬度的型別

例子:#include

typedef union 

my;struct test

myaa;

必須是double 的整數倍 ,所以32

int main()

;int main();

printf("%d %x\n", led, led.a);

led.a = 0;

printf("%x %d\n", led, led.a);

return 0;

} 在嵌入式中最好設它為無符號整型。

當設它為有符號整數時:

struct gpiof;

輸出結構等於 80 ffffffff(十六進製制)

40 0

因為賦值時,比如led.a=1;

剩下位補1 因為為有符號int(其實等於-1)

還不知道為什麼,如果要取正確的位數就要&結構體成員的位數

所以盡量用unsigned.

結構體及位域

結構體 結構體是一種集合,它裡面包含了多個變數或陣列,它們的型別可以相同,也可以不同,每個這樣的變數或陣列都稱為結構體的成員 member 結構體定義 struct st 這個結構體定義了整形變數a,浮點型變數 b,等等 注意 大括號後面的封號不能省略 2,結構體變數 類似於這些整形變數等等 定義結...

C結構體之位域

有些資訊在儲存時,並不需要占用乙個完整的位元組,而只需佔幾個或乙個二進位制位。例如在存放乙個開關量時,只有0和1 兩種狀態,用一位二進位即可。為了節省儲存空間,並使處理簡便,c語言又提供了一種資料結構,稱為 位域 或 位段 所謂 位域 是把乙個位元組中的二進位劃分為幾個不同的區域,並說明每個區域的位...

C結構體之位域

有些資訊在儲存時,並不需要占用乙個完整的位元組,而只需佔幾個或乙個二進位制位。例如在存放乙個開關量時,只有0和1 兩種狀態,用一位二進位即可。為了節省儲存空間,並使處理簡便,c語言又提供了一種資料結構,稱為 位域 或 位段 所謂 位域 是把乙個位元組中的二進位劃分為幾個不同的區域,並說明每個區域的位...