| 特性 | sizeof | strlen |
|---|---|---|
| 性質 | 編譯期運算子 | 執行期函式 |
| 單位 | 位元組 | 字元數(不含結尾 \\0) |
| 參數 | 型別或運算式(變數/陣列/結構) | 以 \\0 結尾的 char* |
| 陣列參數 | 不退化,得整個陣列大小 | 退化為指標,僅得指標大小 |
| 動態陣列 | 無法得知大小(得指標大小) | 正常運作 |
char* ss = "0123456789";
sizeof(ss) // 4 (指標大小)
sizeof(*ss) // 1 (char)
char ss[] = "0123456789";
sizeof(ss) // 11 (含結尾 \\0)
strlen(ss) // 10
char ss[100] = "0123456789";
sizeof(ss) // 100 (陣列宣告大小)
strlen(ss) // 10
int ss[100] = {0};
sizeof(ss) // 400 (100 * sizeof(int))
strlen(ss) // 編譯錯誤:參數必須是 char*
size_t(unsigned int 別名),保證容納最大物件位元組數。sizeof(type) 需括號,sizeof var 可省略括號。sizeof(f()) 等於 sizeof(回傳型別),不會真正呼叫函式。sizeof 能計算陣列維度的關鍵(sizeof(arr)/sizeof(arr[0]))。char buf[sizeof(struct)]。
class X { int i; int j; char k; }; // 4+4+1 = 9,但對齊至 12
X x;
sizeof(X) // 12
sizeof(x) // 12
對齊單位通常為 4 或 8 位元組(VC++ 可用 #pragma pack(n) 或專案設定調整)。
void fun(char szPath[MAX_PATH]) // 等價於 void fun(char* szPath)
{
sizeof(szPath); // 4 (指標大小),非 MAX_PATH!
}
解決方案:額外傳遞長度參數,或在函式內 memcpy 複製到本地陣列。
sizeof(void()) 錯誤)extern int arr[])、未定義結構/聯集、voidmalloc(sizeof(MyStruct))、new char[sizeof(Buffer)]fread(buf, sizeof(buf), 1, fp)、write(fd, &obj, sizeof(obj))memset(&obj, 0, sizeof(obj))、memcpy(dst, src, sizeof(src))dwSize = sizeof(STRUCT) 欄位,便於版本相容。send(sock, buf, sizeof(buf), 0) 優於硬編碼長度。char*。sizeof 失效,需額外傳長度。sizeof 消除魔術數字,提升可維護性與移植性。