| 特性 | sizeof | strlen |
|---|---|---|
| 性質 | 運算符 (C++ 關鍵字) | 運行期庫函數 |
| 計算時機 | 編譯期 (大多數情況) | 運行期 |
| 參數類型 | 類型或表達式 | 僅 char* (以 '\0' 結尾) |
| 返回值 | 類型/對象佔用位元組數 | 字符串有效字符長度 (不含 '\0') |
| 返回類型 | size_t (unsigned int) | size_t |
| 陣列參數 | 不退化,得整個陣列大小 | 退化為指標,得字符串長度 |
| 括號規則 | 類型須加括號,變數可不加 | 函數調用必須加括號 |
char str[20] = "0123456789"; // 10 個字符 + '\0',佔 11 位元組,陣列大小 20 int a = strlen(str); // a = 10 (字符串長度) int b = sizeof(str); // b = 20 (陣列總大小,含未使用空間)
void fun(char arr[8]) // 等價於 void fun(char *arr) void fun(char arr[]) // 等價於 void fun(char *arr) void fun(char *arr) // 本質相同
函數內 sizeof(arr) 返回指標大小 (4/8 位元組),無法獲知陣列長度。
fun(unsigned char *p, int len)struct { int len; char *data; }std::vector、std::string、std::span (C++20)char *ss = "0123456789"; sizeof(ss); // 4/8 (指標大小) sizeof(*ss); // 1 (char 大小) strlen(ss); // 10 (字符串長度)
sizeof(struct):返回實際大小 (含對齊填充)sizeof(static_array):返回整個陣列大小sizeof 無法 獲取動態分配記憶體 (malloc) 或外部陣列 (extern) 大小short f();
printf("%zu\n", sizeof(f())); // 輸出 2 (sizeof(short)),f() 不會被調用
關鍵:sizeof 運算元表達式不求值,僅推導類型。
| 錯誤代碼 | 問題 | 正確做法 |
|---|---|---|
sizeof("abc") 以為是 3 | 字符串常量含 '\0',大小為 4 | 字符串長度用 strlen,大小用 sizeof |
函數內用 sizeof(arr) 獲取陣列長度 | 參數退化為指標 | 額外傳長度或用容器 |
malloc(sizeof(ptr)) 以為分配陣列空間 | ptr 是指標,只得指標大小 | malloc(n * sizeof(*ptr)) |
結構體 sizeof 忽略對齊填充 | 實際大小 ≥ 成員大小之和 | 用 offsetof、sizeof 實測 |
sizeof (編譯期、無開銷)strlen (運行期、遍歷計數)malloc(count * sizeof(*ptr)) 類型安全sizeof(struct) 含填充位元組