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

C語言聯合體與大小端模式深度解析:記憶體佈局實測與應用

     編輯:關於C語言

C語言聯合體與大小端模式深度解析:記憶體佈局實測與應用

聯合體 union 讓多個成員共用同一塊記憶體,是檢測系統大小端、型別雙關、省記憶體的利器。本文詳細對比 union 與 struct 記憶體模型,並以實測代碼證明 x86 小端模式特性。

union vs struct 記憶體模型

特性structunion
成員儲存各自獨立空間,依宣告順序排列完全重疊,共用同一起始位址
總大小所有成員大小之和(含對齊填充)最大成員的大小(對齊至最大對齊需求)
存取語意同時存在所有成員同一時間只能有效存取一個成員
典型用途資料聚合、記錄型別轉換、省記憶體、硬體暫存器映射

union 大小實測

#include <stdio.h>

union UnionTest {
    int a;        // 4 bytes
    double b;     // 8 bytes
};

int main() {
    union UnionTest test;
    printf("sizeof(test) = %zu\n", sizeof(test)); // 輸出 8
    return 0;
}

結果證明:union 大小 = 最大成員大小 (對齊後)。

大小端模式實測

#include <stdio.h>

union EndianTest {
    char c[4];  // 4 個位元組
    int i;      // 1 個 32 位整數
};

int main() {
    union EndianTest data;
    data.c[0] = 0x04; // 低位址
    data.c[1] = 0x03;
    data.c[2] = 0x02;
    data.c[3] = 0x11; // 高位址
    // 記憶體由低址到高址:04 03 02 11

    printf("0x%08x\n", data.i); // 以整數方式讀取
    return 0;
}

輸出結果解讀

  • 小端模式:0x11020304(低位元組儲存在低位址)
  • 大端模式:0x04030211(高位元組儲存在低位址)

x86/x64、ARM (預設) 皆為小端模式;網路傳序為大端模式,需用 htonl/ntohl 轉換。

實戰應用場景

  1. 型別雙關:無需轉換即可以不同型別檢視同一記憶體(如浮點數位元模式)
  2. 協定解析:網路封包頭部映射到 union,char buf[] 接收原始位元組,struct Header h 直接存取欄位
  3. 省記憶體:互斥狀態的資料(如事件類型+承載)共用空間
  4. 硬體暫存器:位欄位結構體配合 union 映射 32 位暫存器

標準合規性提醒

  • C 標準允許共用體型別雙關(C99 明確支援),但讀取非最後寫入的成員屬於實作定義行為
  • 嚴格別名規則:除 char* 外,不同型別指標不得指向同一記憶體,union 是合法例外
  • 跨平台程式碼應使用 htonl/ntohl 或序列化庫處理端序,避免直接依賴 union 型別雙關

深入理解 union 記憶體佈局與端序,是系統程式設計、嵌入式開發、網路協定實作的核心基本功。

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