1. 程式人生 > >淺談 C 語言中的結構體【struct】與聯合體【union】

淺談 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值的大小將不產生任何效果。