Struct 和 Union 的詳細區別

2022-07-17 02:51:08 字數 1339 閱讀 6075

union: 共用體

struct:結構體

兩者的區別:

1:共用體和結構體都是由多個不同的資料型別成員組成, 但在任何同一時刻, 共用體只存放乙個被選中的成員, 而結構體則存放所有的成員變數。

2:對於共用體的不同成員賦值,將會對其他成員重寫, 原來成員的值就不存在了, 而對於結構體的不同成員賦值是互不影響的

3:記憶體分配不同

union的大小為其內部所有變數的最大值,按照最大型別的倍數進行分配大小

如:typedef union 

u11;

typedef union 

u22;

typedef union 

u33;

sizeof(u11)結果是

10sizeof(u22)結果是

12,按照

sizeof(int)*3

分配空間

sizeof(u33)結果是

16,按照

sizeof(double)*2

分配空間。

結構體struct

非配方法類似,也是按照最大型別的倍數進行分配大小

,但是還與順序有關

如:typedef struct s1

s11;

typedef struct s2

s22;

typedef struct s3

s33;

sizeof(s11)結果是應該是

9,但是系統按照

sizeof(double)*2

分配,所以大小是

16sizeof(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的順序分配可以節省記憶體。

struct和union的大小

結構體預設對齊方式 在預設對齊方式下,結構體成員的記憶體分配滿足下面三個條件 1.第乙個成員的位址和結構體的首位址相同,即偏移量為0。2.結構體每個成員位址相對於結構體首位址的偏移量 offset 是該成員大小的整數倍,如果不是則編譯器會在成員之間新增填充位元組 internal adding 3....

struct和union的記憶體分配

struct struct結構體在分配記憶體時需要遵循記憶體對齊規則 1.結構體的起始儲存位置必須是能夠被該結構體中最大的資料型別所整除 2.前面單元的大小必須是後面單元大小的整數倍 每個資料成員儲存的起始位址必須是自身大小的整數倍 如果不夠就補齊 3.整個結構體的大小 即sizeof的結果 必須是...

關於Union和Struct對齊

關於union,struct,還有機器數賦值,總是感覺自己認識不是特別深刻,這裡使用小demo程式加以說明,具體的詳細細節描述其它地方已經有說明和記錄,這裡不再說明。include union myun u int k a int main output size is 12 0 5 6 說明 in...