Union: 共用體
Struct:結構體
兩者的區別:
1:共用體和結構體都是由多個不同的數據類型成員組成, 但在任何同一時刻, 共用體只存放一個被選中的成員, 而結構體則存放所有的成員變量。
2:對於共用體的不同成員賦值,將會對其他成員重寫, 原來成員的值就不存在了, 而對於結構體的不同成員賦值是互不影響的
3:內存分配不同
union的大小為其內部所有變量的最大值,按照最大類型的倍數進行分配大小
如:
typedef Union
{
char c[10];
char cc1;
}u11;
typedef union
{
char c[10];
int i;
}u22;
typedef union
{
char c[10];
double d;
}u33;
sizeof(u11)結果是10
sizeof(u22)結果是12,按照sizeof(int)*3分配空間
sizeof(u33)結果是16,按照sizeof(double)*2分配空間。
結構體struct非配方法類似,也是按照最大類型的倍數進行分配大小,但是還與順序有關
如:
typedef struct s1
{
char c;
double d;
}s11;
typedef struct s2
{
char c;
char cc;
double d;
}s22;
typedef struct s3
{
char c;
double d;
char cc;
}s33;
sizeof(s11)結果是應該是9,但是系統按照sizeof(double)*2分配,所以大小是16
sizeof(s22)結果是應該是10,但是系統按照sizeof(double)*2分配,所以大小是16,先分配8字節給c,c占用一個字節,剩余7字節可以存儲cc,所以系統沒有額外給cc分配內存。cc有了內存后剩余6字節無法存儲d,系統就額外為d分配8字節,整個分配浪費內存6字節。
sizeof(s22)結果是應該是10,但是系統按照sizeof(double)*3分配,所以大小是24,因為和定義順序有關,所以當給c分配8個字節之后,剩余7個字節無法存儲d,所以系統又分配了8個字節給d,之后又分配8個自己給cc,分配完后浪費了14個字節的空間。所以,在定義結構體struct 的時候按照s33的順序分配可以節省內存。
