首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言 union 共用體深度解析:內存佈局、成員覆蓋規則與實戰應用

     編輯:關於C語言

什麼是共用體

union 是一種特殊的構造類型,允許在同一塊內存空間中存儲不同類型的數據(但同一時刻只能存儲其中一個)。其大小由最大成員決定,所有成員從低地址起始存放,實現「以空間換靈活」或「類型雙關」目的。

語法與聲明

union Data {
    char c;
    int a;
    int b;
} demo;  // 直接定義變量

// 或分離聲明
union Data { char c; int a; int b; };
union Data demo;

核心特性詳解

1. 大小由最大成員決定

sizeof(demo) == sizeof(int) == 4(假設 int 4 字節),而非成員大小之和。

2. 成員共享內存,同一時刻只能用一個

demo.c = 'H';  // 0x48
demo.a = 10;   // 0x0000000A 覆蓋前 4 字節
demo.b = 12;   // 0x0000000C 再次覆蓋
// 此時 demo.c 讀出為 12 (0x0C),demo.a/demo.b 均為 12

3. 不同大小成員的部分覆蓋規則

若 char c (1B) 與 int a (4B) 共用:

  • 寫 c 僅修改最低 1 字節,a 高 3 字節保持不變。
  • 寫 a 會完全覆蓋c。

此特性常用於大小端檢測、位域操作、網絡協議報文解析。

4. 存放順序:所有成員從低地址開始

無對齊填充,&demo.c == &demo.a == &demo.b == &demo。

實戰代碼演示

#include 
#include 

typedef union {
    char c;
    int a;
    int b;
} Demo;

int main() {
    Demo d;
    d.c = 'H';  // 0x48
    d.a = 10;   // 0x0000000A
    d.b = 12;   // 0x0000000C

    printf("Size: %zu\n", sizeof(d));          // 4
    printf("Values: %c %d %d\n", d.c, d.a, d.b); // 12 12 12 (ASCII 12 為控制字符)
    return 0;
}

運行結果截圖

典型應用場景

場景說明
協議報文解析同一字節流按不同結構體/union 解析頭部/負載
大小端檢測union {int i; char c[4];} u; u.i=1; u.c[0]==1 為小端
類型雙關優化浮點數位操作:union {float f; uint32_t u;} 避免指針轉換違反嚴格別名規則
節省內存互斥狀態數據(如事件類型+負載)共用存儲

注意事項

  • 嚴格別名規則:union 是 C 標準允許的類型雙關方式,禁止 用指針強轉(如 *(int*)&f)訪問不同類型對象,屬於未定義行為。
  • 匿名 union(C11)可直接在結構體中聲明,成員提升為結構體成員直接訪問。
  • 對齊要求:union 對齊數等於成員中最大對齊數。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved