結構體的記憶體對齊
位段列舉
聯合結構體是一些值的集合,這些值被稱為成員變數,結構的每個成員可以是不同型別的變數。
struct piont
p1;//宣告結構體型別,同時定義變數p1
struct point p2;
//定義結構體變數p2
struct point p3 =
;//初始化:定義變數同時賦值
struct point* p4;
//定義結構體型別指標
結構體在宣告的時候可以省略結構體標籤(tag),稱之為匿名結構體,但很少會用到。
結構體可以使用 初始化,但不能用它賦值。
結構體變數訪問成員,通過(.)操作符來訪問。
例如:
p1.x =20;
p1.y =
10;
結構體指標訪問指向變數的成員,使用( -> )操作符來訪問
例如:
printf
("%d,%d\n"
, p4->x, p4->y)
;
結構體可以自引用,但是只能通過包含自身型別的指標這種方式來自引用。
結構體的記憶體對齊規則:
第乙個成員在與結構體變數偏移量為 0 的位址處。
其他成員變數要對齊到某個數字(稱之為對齊數)的整數倍位址處。
結構體總大小為最大對齊數(每個成員變數都有乙個對齊數)的整數倍。
如果巢狀了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數(含巢狀結構體的對齊數)的整數倍
對齊數:編譯器預設的乙個對齊數,與該成員大小的較小值舉例一:(vs2013下)
struct s
;
對於該結構體型別來說,它佔據記憶體空間大小的計算方法是:
根據第二條規則,對第二個成員,它是int型別變數,4個位元組,與最大對齊數8相比,4更小,所以該成員的對齊數是4,要放在4的整數倍位址處,此時第乙個成員佔據的第乙個位元組之後的三個位元組被開闢,在距離結構體變數偏移為4的位址處算四個位元組,此時結構體變數有八個位元組。
前兩個成員根據第二條規則,對於第三個成員,double型別,八個位元組,與預設對齊數相等,所以對齊數取8,它放在8的整數倍位址上,即放在距離結構體變數偏移為8的位址處,此時結構體變數有16個位元組。
前三個成員根據第二條規則,第四個成員,char型別,乙個位元組,同上,它的對齊數是 1,所以直接放置即可,此時結構體變數有17個位元組
根據第二條規則,第五個成員,型別是short,兩個位元組,同上,它的對齊數是2,放在位址是二的整數倍處,即第18個位元組處,此時結構體變數為20個位元組
所有的五個成員根據第三條規則:結構體總大小為最大對齊數(每個成員變數都有乙個對齊數)的整數倍,這個結構體的最大對齊數是8,那麼它佔據的記憶體應該是八的整數倍,此時20個位元組,補齊到24個位元組即為八的整數倍
所以,在舉例一種,該結構體的大小為24個位元組。
舉例二:
求此時struct s2 結構體型別的大小
struct s
;struct s2
;
根據第四條規則,如果巢狀了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數(含巢狀結構體的對齊數)的整數倍,結構體s中的最大對齊數是8,那麼就要對齊到八的整數倍位址處,此時第乙個位元組往後開闢七個位元組之後,來存放該結構體型別變數,這個結構體型別變數的大小在舉例一中計算過,24個位元組,所以此時s2為32個位元組。
前兩個成員根據第二條規則,第三成員是char型別,1個位元組,對齊數為1,所以此時結構體s2為33個位元組。
根據第二條規則,第四成員為int型別,四個位元組,對齊數為4,對齊到4的整數倍位址處,即第36個位元組處,此時結構體大小為40位元組。
根據第三條規則,該結構體各個成員中最大對齊數是八,所以它佔據的記憶體應為八的整數倍,而40正好是八的整數倍,所以不用補齊
所以舉例二中結構體型別的大小應為40位元組。
位段的宣告和結構體類似,但是位段的成員必須是int 、unsigned int或signed int,位段的成員後有乙個冒號和乙個數字。冒號後的數字是幾,就說明前邊的成員變數佔幾個位元位。
struct a
;
將可能的取值一一枚舉,即為列舉
enum season
;
列舉常量的值預設由0開始依次遞增,除非在宣告中賦值
該型別定義的變數包含一系列成員,但是這些成員都公用同一塊記憶體空間
union un
;
可以用它的特性來判斷大小端位元組序,例如:
union un
;int
main()
//輸出為44,當前機器為小端位元組序。
聯合的大小: C語言中的自定義型別 結構體 列舉 聯合
我們知道c語言基本資料型別有 本篇將重點介紹c語言中的自定義型別 結構體 列舉 聯合 struct stu int main 含義 define crt secure no warnings 1 include include struct x struct p int main 上面的 執行後發現...
C語言中的自定義型別 結構體,列舉,聯合(總結)
結構體型別的宣告struct tag variable list 例如描述乙個學生 struct stu 分號不能丟 特殊宣告 匿名結構體型別 struct x struct a 20 p 結構的自引用 1 struct node 該結構體定義是錯誤的,因為結構體的大小是根據其中的成員變數的大小以及...
C語言 自定義型別 結構體 列舉 聯合
二 列舉 三 聯合 1.結構體型別建立 struct stu 定義乙個學生結構體 分號不能丟 特殊的宣告 在宣告結構的時候,可以不完全的宣告 比如 匿名結構體型別 struct x struct a 20 p p x 非法,編譯器會把上面的兩個宣告當成完全不同的兩個型別 結構的不完整宣告 struc...