結構體的大小:
規則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語言又提供了一種資料結構,稱為 位域 或 位段 所謂 位域 是把乙個位元組中的二進位劃分為幾個不同的區域,並說明每個區域的位...