'\0',返回**字元數**(不含結尾符)。參數必須為以空字元結尾的有效指標,**行為未定義**若無終止符。char *str_1 = "12345"; // 指向字串常量區
char str_2[] = "12345"; // 陣列,大小 6 (含 \0)
char str_3[5] = { '1' }; // 陣列大小 5,內容 '1','\0','\0','\0','\0'
char str_4[5] = { '1','2','3','4','5' }; // 陣列大小 5,**無結尾 \0**
| 表達式 | 值 | 解析 |
|---|---|---|
sizeof(str_1) | 4 或 8 | 指標大小 (32/64 位) |
sizeof(*str_1) | 1 | 解引用為 char,1 字節 |
strlen(str_1) | 5 | 常量區 "12345\0" 長度 5 |
sizeof(str_2) | 6 | 陣列總大小 (含 \0) |
strlen(str_2) | 5 | 遇到 \0 停止 |
sizeof(str_3) | 5 | 陣列聲明大小 |
strlen(str_3) | 1 | 首字元 '1' 後即 \0 |
sizeof(str_4) | 5 | 陣列聲明大小 |
strlen(str_4) | 未定義 (隨機值/崩潰) | **無 \0 終止符**,越界訪問 |
strlen(*str_1) | 編譯錯誤 | *str_1 為 char,非指標,類型不匹配 |
sizeof(指標) ≠ 字串長度;sizeof(陣列) = 總位元組數。strlen 依賴 \0,缺失導致 UB。str_4 是經典陷阱。sizeof 無運行開銷;strlen 需遍歷。strlen 要求 const char*,傳 char 會報錯。std::string / std::string_view,.size() 統一語意、無 UB。char s[] = "abc"; 自動計算。strlen;需分配緩衝區大小用 sizeof (陣列) 或 strlen+1 (指標)。sizeof 問「佔多少記憶體」,strlen 問「有多少可見字元」。搞清**類型(指標/陣列)**、**生命週期(編譯/執行)**、**終止符依賴**,即可徹底掌握此類基礎考點。