C語言中的自定義型別(結構體 列舉及聯合)

2021-10-03 20:23:07 字數 2949 閱讀 9184

結構體的記憶體對齊

位段列舉

聯合結構體是一些值的集合,這些值被稱為成員變數,結構的每個成員可以是不同型別的變數。

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...