| 特性 | sizeof | strlen |
|---|---|---|
| 本質 | 編譯期運算符 | 運行期庫函數 |
| 參數類型 | 任意類型/變量/表達式 | 僅限 char*(以 '\0' 結尾) |
| 返回值 | 類型/對象佔用字節數(size_t) | 字符串長度(不含結束符) |
| 計算時機 | 編譯期確定 | 運行時遍歷計算 |
| 數組參數 | 不退化,得整個數組大小 | 退化為指針,得指針大小 |
| 結構體/對象 | 返回實際佔用內存(含對齊填充) | 不適用 |
| 動態分配內存 | 返回指針大小,無法得知分配大小 | 若指向 C 字符串則返回長度 |
char str[20] = "0123456789";
int a = strlen(str); // a = 10,字符串實際長度
int b = sizeof(str); // b = 20,數組分配空間大小
char *p = "0123456789";
sizeof(p); // 4/8(指針大小,視平台 32/64 位)
sizeof(*p); // 1(char 類型大小)
strlen(p); // 10(字符串長度)
sizeof(int)、sizeof(double) —— 必須加括號。sizeof x、sizeof(x) —— 括號可選。short f(); sizeof(f()) 返回 sizeof(short),函數不會真正調用。void fun(char arr[8]) // 等價於 void fun(char *arr)
void fun(char arr[]) // 等價於 void fun(char *arr)
函數內 sizeof(arr) 返回指針大小(4/8),而非數組大小。解決方案:額外傳遞長度參數,或使用模板/引用保持數組類型:
template
void fun(char (&arr)[N]) { /* sizeof(arr) == N */ }
struct A { char c; int i; }; // 通常 sizeof(A) == 8(含 3 字節填充)
sizeof 返回編譯器分配的完整大小,包含對齊填充字節。
char a[100]; sizeof(a) == 100。char *p = new char[100]; sizeof(p) == 4/8(指針大小),無法通過 sizeof 獲取 100。std::string、std::vector、std::array,分別提供 .size()、.size()、.size(),避免手動計算。std::span C++20)。sizeof 是編譯期運算符,反映類型/對象在內存中的佔用大小;strlen 是運行期函數,專門統計以 '\0' 結尾的字符串長度。兩者應用場景截然不同,混淆會導致嚴重邏輯錯誤(如緩衝區溢出、截斷)。理解數組退化、指針大小、動態分配限制,是寫出健壯 C/C++ 代碼的基礎。