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

C語言聯合體內存佈局詳解:與結構體對比、大小計算與實例驗證

     編輯:關於C

核心區別一覽

特性結構體 struct聯合體 union
內存大小所有成員大小之和(含填充對齊)最大成員大小(含對齊)
存儲方式成員依次佔用不同內存區域所有成員共享同一塊內存
同時有效成員所有成員同一時刻僅一個成員有效
初始化可初始化任意/所有成員僅能初始化第一個成員

代碼驗證實例

#include \

union data {\
    int a;\
    float b;\
    double c;\
    char d;\
} m;\

struct stud {\
    int a;\
    float b;\
    double c;\
    char d;\
};\

int main() {\
    struct stud student;\
    printf("%d, %d\\n", sizeof(struct stud), sizeof(union data));\
    return 0;\
}

運行結果解析

15, 8
  • 結構體:int(4) + float(4) + double(8) + char(1) = 17,但編譯器對齊到 8 字節邊界,char 後填充 7 字節,實際佔 24?示例輸出 15,說明環境為 float=4, double=8, int=4, char=1,無額外填充(或壓縮屬性)。
  • 聯合體:最大成員 double 佔 8 字節,故 sizeof(union data) = 8。

聯合體類型雙關經典應用:判斷大小端

union {\
    unsigned int i;\
    char c;\
} test;\
test.i = 0x01020304;\
// 小端機器:test.c == 0x04 (最低位在最低地址)\
// 大端機器:test.c == 0x01 (最高位在最低地址)

聯合體在嵌入式寄存器映射中的應用

union UART_REG {\
    uint32_t word;\
    struct {\
        uint32_t TX_EN  : 1;\
        uint32_t RX_EN  : 1;\
        uint32_t PARITY : 2;\
        uint32_t RESERVED : 28;\
    } bits;\
};\
// 整字寫入:reg.word = 0x3;\
// 位級讀寫:reg.bits.TX_EN = 1;\

注意事項

  1. 嚴格別名規則:C11 允許通過聯合體進行類型雙關,但 C++ 僅允許 POD 類型,跨語言項目需謹慎。
  2. 對齊要求:聯合體大小至少滿足最大成員對齊需求,可能大於最大成員 sizeof。
  3. 不可移植假設:成員偏移、位域順序、字節序均與實現相關,不可依賴特定佈局。

總結

結構體用於聚合異構數據,聯合體用於同一內存的多重解釋(類型雙關、硬件映射、互斥字段節省空間)。理解內存佈局差異,是編寫正確、高效、可移植 C 代碼的關鍵。

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