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

深度解析 C 語言 sizeof:結構體對齊、陣列退化與實戰陷阱

     編輯:關於C語言

sizeof 基礎

  • 編譯期單目運算符,非函數。
  • 返回類型 size_t(unsigned int)。
  • 語法:sizeof(類型) 必加括號;sizeof 變量 可不加。
  • 不可用於:函數類型、不完全類型(未知大小數組/結構)、void、位域。

各類型 sizeof 結果(視平台)

類型典型大小
char/signed char/unsigned char1
short2
int/long/float4
double8
long double10/12/16
指針32位=4, 64位=8

結構體對齊核心規則(VC/MSVC)

  1. 成員對齊:每個成員相對結構體起始偏移量必須是該成員類型大小的倍數。
  2. 整體對齊:結構體總大小必須是最大成員類型大小的倍數,不足尾部填充。
  3. 順序分配:按聲明順序依次放置,不足對齊處插入填充位元組。

實例推演

struct MyStruct {
    double dda1;  // 8 字節,偏移 0(8 的倍數)
    char dda;     // 1 字節,偏移 8(1 的倍數)
    int type;     // 4 字節,偏移 9→填充 3 字節→偏移 12(4 的倍數)
};  // 目前 16 字節,已是最大成員 8 的倍數,無尾部填充
// sizeof(MyStruct) = 16

若調整順序:

struct Better {
    double dda1;  // 0
    int type;     // 8 (8 的倍數)
    char dda;     // 12
};  // 總 13 → 尾部填充 3 → 16
// 同樣 16,但中間填充從 3 變 0,尾部填充 3

常用類型對齊要求(VC 32 位)

類型對齊倍數
char1
short2
int/long/float4
double8

控制對齊的方法

  • #pragma pack(n):指定最大對齊數(1/2/4/8/16),成員對齊取 min(類型大小, n)。
  • __declspec(align(n)):強制結構體/變量按 n 字節對齊。
  • 合理排序成員(大類型在前)可自然減少填充。

sizeof 進階場景

  1. 陣列:sizeof(arr) 得全大小;函數參數退化為指針得指針大小。
  2. 聯合:等於最大成員大小(含對齊)。
  3. 表達式:sizeof(expr) 得表達式結果類型大小,不求值(sizeof(f()) 不調用 f)。
  4. 動態記憶體:sizeof(p) 永遠是指針大小,無法得知分配大小。

最佳實踐

涉及位元組大小計算(malloc/memcpy/fread/數組元素數)一律用 sizeof,拒絕魔術數字,保證跨平台可移植。

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