淺談 C 語言中的結構體【struct】與聯合體【union】
## C語言中結構 struct 與聯合 union 語法基本一致,如下以 struct 為例
一、struct 的基本用法
struct student { int num; char* sex; int age; }; 結構體的宣告與定義 struct student stu; 變數的宣告與定義 stu.num = 0110; stu.sex = "男"; stu.age = 20; 變數的使用
二、在宣告結構體時同時定義變數
struct student
{
int num;
char* sex;
int age;
}stu = {0110, "男", 20}; 初始化部分可選
stu.num = 0110;
stu.sex = "男";
stu.age = 20; 變數的使用
三、使用 typedef 簡化結構體型別名
typedef struct student 型別重定義 { int num; char* sex; int age; }student; 結構體的宣告與定義 student stu; 變數的宣告與定義 stu.num = 0110; stu.sex = "男"; stu.age = 20; 變數的使用
四、結構體 struct 與 聯合體 union 的區別
1、struct 中的成員是按順序依次排列,互相獨立,在排列時引入了對齊問題(*);
而union中的成員共用一塊記憶體,起始地址都是相同的,即union中的成員是對同一地址的多個引用、對同一地址的多種表達方
2、對於union 的不同成員賦值, 將會對其它成員重寫, 原來成員的值就不存在了, 而對於struct 的不同成員賦值是互不影響的。
五、記憶體對齊
1、什麼是記憶體對齊?
································································
2、為什麼要進行記憶體對齊?
平臺原因(移植原因):
不是所有的硬體平臺都能訪問任意地址上的任意資料的;
某些硬體平臺只能在某些地址處取某些特定型別的資料,否則丟擲硬體異常。
效能原因:
資料結構(尤其是棧)應該儘可能地在自然邊界上對齊。
原因在於,為了訪問未對齊的記憶體,處理器需要作兩次記憶體訪問;而對齊的記憶體訪問僅需要一次訪問。
3、記憶體對齊規則?
在記憶體中,編譯器按照成員列表順序分別為每個結構體變數成員分配記憶體,當儲存過程中需要滿足邊界對齊的要求時,編
譯器會在成員之間留下額外的記憶體空間。如果想確認結構體佔多少儲存空間,則使用關鍵字sizeof,如果想得知結構體的某個特
定成員在結構體的位置,則使用offsetof巨集(定義於stddef.h)。
資料成員對齊規則:結構 struct 或聯合 union 的資料成員,第一個資料成員放在 offset 為 0 的地方,以後
每個資料成員的對齊按照 #pragma pack(n) 指定的數值和這個資料成員自身長度中,比較小的那個進行。
結構(或聯合)的整體對齊規則:在資料成員完成各自對齊之後,結構(或聯合)本身也要進行對齊,對齊將按照
#pragma pack指定的數值和結構(或聯合)最大資料成員長度中,比較小的那個進行。
結合1、2可推斷:當 #pragma pack(n) 的n值等於或超過所有資料成員長度的時候,這個n值的大小將不產生任何效果。