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

C 語言聯合體 用法完整指南:宣告、記憶體共享與實戰技巧

     編輯:C 語言入門

聯合體核心概念

聯合體 是一種特殊的建構型別,允許在相同記憶體位置儲存不同型別的資料(但同一時間僅能存取其中一個成員)。主要用途:節省記憶體空間、型別雙關、硬體暫存器映射。

宣告語法

union UnionName {
    type1 member1;
    type2 member2;
    // ...
} variable_list;

// 等價於
union UnionName {
    type1 member1;
    type2 member2;
};
union UnionName var1, var2;

四大關鍵特性

特性說明範例
大小由最大成員決定sizeof(union) == sizeof(largest_member) (含對齊填充)union {char c; int i;} → 4 bytes
成員共享記憶體所有成員起始位址相同 (offset = 0)&u.c == &u.i == &u
同一時間單一有效值寫入新成員會覆蓋舊資料u.c='A'; u.i=0x41424344; → c 變 'D'
低位址優先儲存所有成員從低位址開始存放小端序下 int 低位元組對齊 char

實戰程式碼範例

#include 
#include 

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

int main() {
    Demo d;
    d.c = 'H';  // 0x48
    d.a = 10;   // 覆蓋 c,記憶體: 0x0A 00 00 00
    d.b = 12;   // 覆蓋 a,記憶體: 0x0C 00 00 00

    printf("大小: %zu bytes\n", sizeof(d));        // 4
    printf("值: %c\t%d\t%d\n", d.c, d.a, d.b);     // L(0x4C)  12  12
    // 解析: 12 = 0x0C -> 低位元組 0x0C = 'L' (ASCII 76)
    return 0;
}

圖解記憶體佈局

聯合體記憶體佈局圖解

進階應用場景

1. 型別雙關

union FloatBits {
    float f;
    uint32_t bits;
    struct { uint32_t mantissa:23; uint32_t exponent:8; uint32_t sign:1; } parts;
};

void print_float_bits(float val) {
    union FloatBits fb = {.f = val};
    printf("0x%08X | sign=%u exp=%u mantissa=%u\n",
           fb.bits, fb.parts.sign, fb.parts.exponent, fb.parts.mantissa);
}

2. 通訊協定解析

union Packet {
    struct {
        uint16_t header;
        uint8_t  cmd;
        uint8_t  len;
        uint8_t  payload[12];
    } fields;
    uint8_t raw[16];
};

3. 省記憶體的狀態機

union State {
    struct { uint8_t type; int value; } integer;
    struct { uint8_t type; float value; } floating;
    struct { uint8_t type; char str[16]; } string;
};

與結構體比較

維度結構體聯合體
記憶體佈局成員依序排列,位址遞增所有成員位址相同 (offset 0)
大小計算成員大小總和 + 對齊填充最大成員大小 (向上對齊)
同時有效成員全部僅一個
典型用途資料聚合型別轉換、省空間、硬體映射

注意事項

  • 嚴格別名規則:C 標準下透過聯合體存取非最後寫入成員屬未定義行為 (C++ 允許)
  • 位元欄位 在聯合體中行為因編譯器而異,需謹慎測試
  • 對齊要求:聯合體對齊值 = 所有成員對齊值的最大值
  • 初始化:只能初始化第一個成員 union U u = {.c = 'A'};

結語

聯合體是 C 語言處理「同一記憶體、多種解讀」的利器。精通其記憶體共享機制、大小計算規則與型別雙關技巧,能在嵌入式開發、網路協定解析、高效能資料結構等領域發揮關鍵作用。實務上請配合 static_assert 驗證大小與對齊,並以詳細註釋說明預期用法,避免維護困難。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved