參考:Difference between Structure and Union in C
二者區別
struct
這里不做詳細說明,因為參考鏈接中都寫明了。只做一些重點強調。
struct
中聲明的變量,在分配空間的時候,struct結構空間大小,大于等于其內部所有變量大小的總和,一般會大于,因為需要字節對齊。
我們看一個例子
#include <stdio.h>struct MyStruct
{char c;int a;char x;double b;
};int main()
{MyStruct s;s.c = 'c';s.a = 1000;s.x = 'D';s.b = 11.5;return 0;
}
我們依次看看其賦值情況,就可以知道內存分布了。
執行s.c = 'c'
執行s.a = 1000
可以看到,中間跳過了3個字節,因為int
需要4字節對齊。
繼續執行s.x = 'D'
s.b = 11.5
double需要8字節對齊,因此中間跳過了7個字節。
所以對于結構體來說,其內存分布是
所以結構體大小是24字節
驗證一下,沒什么問題。
對于結構體,沒什么好說的,無非就是有相關需求,需要一個結構,有不同的數據類型。
值得說明的是,結構體可以嵌套,例如:
struct{struct{struct{...}}int x;
}
訪問上來說,如果沒名字,就直接訪問,有名字就多幾個.
,指的是這種命名
struct{}name;
不過嵌套結構似乎很少用吧…
union
最大的區別就是,聯合體中定義的不同數據類型,在分配空間的時候是重疊的,也就是說,它的大小應該以占用最大空間的內個為準,要等于它的大小。
#include <stdio.h>union MyUnion
{int a;double b;char c;
};int main()
{MyUnion b;b.a = 10;b.b = 1.0;b.c = 'a';return 0;
}
b
的大小是8,也就是最大的double
的大小。
我們依次運行看看:
b.a = 10
b.b = 1.0
b.c = 'a'
你會發現,都是在這8字節的空間內進行的!
但是注意覆蓋問題。
對于同一塊8字節的內存空間,覆蓋的時候,只覆蓋自己占的地方,例如,對于8字節空間,改變占1字節的
char
的時候,只覆蓋第一個字節,剩下的7字節保持不變。
最后,它也同樣可以嵌套。
至于訪問的時候的變化,只需要明確,訪問的都是對應大小的內存單元。
因此,不管誰改,都是該內存,至于值
- 如果訪問的是double,就是把這8個字節轉換為double
- 如果訪問的是int,就把前4個字節轉換為int
- char同理。