列舉聯合(共用體)
結構體結構體中的成員可以是不同的型別,那麼是如何在計算機中儲存尼。如果和陣列一樣,按照結構體成員的順序一次儲存在連續的記憶體空間,那麼該如何訪問尼,是按照乙個位元組乙個位元組的訪問,還是四個位元組四個位元組的訪問,這就存在型別差異。因此,就定義了乙個對齊規則。在介紹對齊規則前,先了解乙個概念——偏移量。
看這樣乙個結構體:
struct s1
;
偏移量
偏移量指的是結構體變數中成員的位址和結構體變數位址的差。因此,第乙個成員變數的偏移量為0。
對齊規則
第乙個成員在與結構體變數偏移量為0的位址處
其他成員變數要對齊到某個數字(對齊數)的整數倍的位址處。對齊數 = 編譯器預設的乙個對齊數 與 該成員大小 的較小值。vs中的預設值為8 linux中的預設值為4結構體的總大小為最大對齊數(每個成員變數都有乙個對齊數)的整數倍
如果巢狀了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的整數倍,結構體的整體大小就是所有最大對齊數(包含巢狀結構體的對齊數)的整數倍
就上面的例子:
第乙個成員變數 char c1:對齊數為1,該成員大小為1,編譯器預設值為8,取最小值,1
第二個成員變數 int i :對齊數為4,該成員大小為4,編譯器預設值為8,取最小值,4
第三個成員變數 char c2: 對齊數為1,該成員大小為1,編譯器預設值為8,取最小值,1
;上述例題中,是結構體巢狀問題
對於結構體s2,我們可以算出大小為16
第乙個變數c1,對齊數為1,該成員變數大小為1,編譯器預設值為8,取最小值,1
第二個變數s2,對齊數為8(取該結構體中的最大對齊數),該成員大小為16,編譯器預設值為8,取最小值,8
第三個變數d, 對齊數為8,該成員大小為8,編譯器預設值為8,取最小值,8
修改預設對齊數
上述的預設對齊數是可以修改的
#pragma pack(2)//設定預設對齊數為8
struct s1
;#pragma pack()//取消設定的預設對齊數,還原為預設
列舉
列舉變數的大小為4
enum
*** ;
列舉{}中的內容是列舉型別的所有可能取值,也叫列舉常量,預設是從0開始,一次遞增1。也可以在定義的時候賦初值。由於列舉變數的賦值,一次只能存放列舉結構中的某個常數。所以列舉變數的大小,實質是常數所佔記憶體空間的大小,也就是4
聯合(共用體)
聯合也叫做共用體,就是,聯合中的成員公用同一塊空間
union un
;
上述例子的大小為 4
union un
;
第乙個變數對齊數為1,大小為5
第二個變數對齊數為4,大小為4
故最終聯合體的大小為8
C語言結構體,聯合體,列舉體的大小計算
1.結構體struct大小計算 2.聯合體union大小計算 3.列舉體enum的大小計算 1.結構體struct大小計算 奉行兩個規則 1.結構體中每個成員的偏移量必須是該成員自己所佔記憶體大小 的整數倍,否則,會用空白位元組填充。2.當運用規則1 計算結構體大小完畢後,其結構體大小必須是 該結構...
結構體 列舉 聯合的用法
二 列舉 三 聯合體 結構體的宣告如下例 struct student 注意 c 語言中要求,結構體內部不能包含自己這種結構體型別的成員。如下 是不能編譯通過的。struct school 想象一下,以上 如何計算sizeof school 呢?所以這種寫法顯然是不合理的。但是,可以通過指標的方式來...
C 中的結構體 聯合 列舉
1 c 和c語言的區別 1 c 中的空結構體求sizeof大小為1,c中的空結構體大小為0 include using namespace std c 中的空結構體的大小為1 struct a struct b int main 2 c 中結構體型別名 struct 可以省略,c中結構體型別名str...