| 特性 | sizeof | strlen |
|---|---|---|
| 性質 | 編譯期運算符 | 運行期庫函數 |
| 參數 | 類型/變量/表達式 | char*(以 \0 結尾) |
| 語義 | 佔用內存位元組數 | 字符串有效長度(不含 \0) |
| 結果類型 | size_t (unsigned) | size_t |
| 數組參數 | 不退化,得整個數組大小 | 退化為指針,得字符串長度 |
char str[20] = "0123456789"; // 10 字符 + \0
int a = strlen(str); // 10
int b = sizeof(str); // 20 (數組總大小)
char *ss = "0123456789";
sizeof(ss); // 4/8 (指針大小)
sizeof(*ss); // 1 (char 大小)
strlen(ss); // 10 (字符串長度)
sizeof(類型) 必須加括號;sizeof 變量 可不加。sizeof 含對齊填充位元組。sizeof 得全大小;動態分配/外部數組無法通過 sizeof 得知大小。void fun(char[8]) ≡ void fun(char*),sizeof 僅得指針大小。// 錯誤:試圖用 sizeof 獲取動態數組大小
void foo(char *p) {
int n = sizeof(p); // 得 4/8,非預期
}
// 正確:額外傳長度
void foo(char *p, int len) {
char *buf = malloc(len + 1);
memcpy(buf, p, len);
}
sizeof 看類型/定義,靜態多大算多大;
strlen 看內容,遇 \0 就停下。