首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C 語言 struct sizeof 深度解析:零長度數組、對齊與柔性陣列成員

     編輯:程式設計疑難解答

四個結構體 sizeof 結果

結構體定義sizeof說明
S1typedef struct { } S1;0 (C) / 1 (C++)空結構體:C 標準允許 0,C++ 為保證地址唯一性強制 1。
S2struct { int b; int c; }8兩個 int(各 4 字節),無填充,自然對齊。
S3struct { int b; int c; char *p; }16 (64位) / 12 (32位)指標大小隨架構:64位 8 字節,32位 4 字節。結構體對齊到最大成員(指標)。
S4struct { int b; int c; char s[0]; }8零長度數組(柔性陣列成員前身)不佔用空間,sizeof 僅計算前置固定部分。

零長度數組 / 柔性陣列成員 (FAM) 核心機制

struct Flex {
    int len;
    char data[0]; // C99 標準寫法:char data[]; (不寫長度)
};
  • sizeof(Flex) == sizeof(int)(通常 4),不包含 data。
  • 分配時:malloc(sizeof(Flex) + n * sizeof(char)),data 指向結構體尾部的額外記憶體。
  • 用途:變長結構體、網路封包、檔案格式,單次分配提升快取命中率與釋放便利性。

記憶體佈局圖解

S4 (假設 32 位,int 4 字節,對齊 4)
+--------+--------+--------+
|   b    |   c    | s[0]   |  <-- s[0] 位於偏移 8,不佔空間
+--------+--------+--------+
0        4        8        (sizeof = 8)

Flex 分配 10 字節 data
+--------+----------+----------+----------+---+
|  len   | data[0]  | data[1]  |  ...     |   |
+--------+----------+----------+----------+---+
  4         8         9                    18  (總共 4+10=14,對齊可能擴展)

常見誤區

  1. 以為 sizeof 包含柔性陣列:絕不包含,必須手動加上動態長度。
  2. 直接存取 s[0] 當作普通陣列:合法,但必須確保已分配足夠額外空間,否則緩衝區溢位。
  3. C++ 不支援零長度數組:C++11 起可用 std::vector 或 std::string 替代;GCC/Clang 擴展支援但非標準。

總結

sizeof 僅反映**編譯期固定部分**大小。零長度數組/柔性陣列成員是 C 語言實現變長結構體的經典技巧,**不計入 sizeof**,分配時手動加長。理解對齊規則(以最大成員對齊)與架構差異(指標寬度),才能精準預測結構體大小。

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