| 特性 | sizeof | strlen |
|---|---|---|
| 本質 | 編譯期運算符 | 運行期庫函數 |
| 單位 | 位元組 | 字符數(不含結束符) |
| 參數 | 類型、變量、表達式 | 以 \0 結尾的 char* |
| 數組參數 | 不退化,得整個數組大小 | 退化為指針,只能算字符串長度 |
| 結構體 | 含對齊填充位元組 | 不適用 |
char* ss = "0123456789";
sizeof(ss) // 4/8 (指針大小)
sizeof(*ss) // 1 (char)
char ss[] = "0123456789";
sizeof(ss) // 11 (含 \0)
strlen(ss) // 10
char ss[100] = "0123456789";
sizeof(ss) // 100 (整個數組大小)
strlen(ss) // 10
class X { int i; int j; char k; };
sizeof(X) // 12 (內存對齊填充)
void fun(char szPath[MAX_PATH]) {
sizeof(szPath); // 4/8 (指針),非 MAX_PATH
}
sizeof 不能用於:函數類型、位字段、未知大小數組(extern int arr[];)、void 類型。
VC++ 中可用 #pragma pack(n) 或項目屬性調整對齊,影響 sizeof 結果。
malloc(sizeof(T) * n) 代替硬編碼數字。#pragma pack(1) 確保跨平台一致。sizeof(buf) 用於緩衝區大小,strlen(str) 用於有效長度。