sizeof 是運算子,編譯期計算;strlen 是函數,執行期遍歷計算。兩者核心差異在於「測量什麼」與「何時測量」。
| 特性 | sizeof | strlen |
|---|---|---|
| 類型 | 運算子 (關鍵字) | 函數 (<string.h>) |
| 計算時機 | 編譯期 | 執行期 |
| 參數類型 | 型別、變數、表達式 | const char* (C 字串) |
| 測量對象 | 物件佔用位元組數 (含結尾 \0) | 字串長度 (不含結尾 \0) |
| 陣列參數 | 不退化,得知完整大小 | 退化為指標,僅得指標大小 |
char ss[] = "string"; /* 長度 7:'s','t','r','i','n','g','\0' */
printf("%zu %zu\n", sizeof(ss), strlen(ss)); /* 輸出:7 6 */
char *p = "string";
printf("%zu %zu\n", sizeof(p), strlen(p)); /* 輸出:8 6 (64 位系統指標 8 bytes) */
char arr[20] = "hello";
char *ptr = "hello";
sizeof(arr) → 20 (陣列宣告大小)
sizeof(ptr) → 8 (指標大小)
strlen(arr) → 5 (字串長度)
strlen(ptr) → 5 (字串長度)
char s[] = "ab\0cd";
sizeof(s) → 6 (含兩個 \0)
strlen(s) → 2 (遇第一個 \0 停止)
void func(char buf[100]) {
sizeof(buf); // 8 (退化為指標)
}
void func2(char *buf) { /* 同上 */ }
函數參數中陣列一律退化為指標,sizeof 失去陣列大小資訊。解決方案:額外傳遞長度參數或使用結構體封裝。
sizeofstrlenstd::string::size()、std::vector::size()、std::span (C++20)口訣:sizeof 看盒子多大,strlen 看裡面字串多長。