在 C/C++ 開發中,strlen 與 sizeof 是最容易混淆卻又最關鍵的兩個概念。搞錯它們會導致緩衝區溢位、記憶體洩漏、邏輯錯誤等嚴重問題。本文從底層原理、編譯期與執行期差異、指針與陣列退化等多個維度徹底釐清。
size_t strlen(const char *str); // 標準 C
// VC6.0 中:extern unsigned int strlen(char *s);
從指定位址開始掃描,遇到第一個 '\0' 結束符停止,回傳計數值(不含結束符)。
<string.h> 函式庫函數'\0' 結尾的合法字串指標char aa[10]; // 未初始化
strlen(aa); // ❌ 結果不定,可能導致段錯誤
char bb[10] = {'\0'}; // 明確初始化為空字串
strlen(bb); // ✅ 0
char cc[10] = "jun"; // 自動補 '\0'
strlen(cc); // ✅ 3
size_t)| 運算元 | sizeof 結果 | 說明 |
|---|---|---|
char str[20] = "0123456789" | 20 | 陣列總大小(含隱含 '\0') |
char *ss = "0123456789" | 4/8 | 指標本身大小(32/64 位元) |
*ss | 1 | 首字元大小 |
int a[10] | 40 | 10 * sizeof(int) |
short f(); sizeof(f()) | 2 | 函數回傳型別大小 |
strlen 是函數,sizeof 是運算子char* vs 任意型別/變數/運算式strlen 退化為指標;sizeof 保留陣列完整資訊sizeof(struct) 會包含填充位元組sizeof 無法得知 malloc 分配的大小,只能得知指標大小size_t my_strlen(const char *s) {
const char *p = s;
while (*p != '\0') ++p;
return p - s;
}
size_t my_strlen_rec(const char *s) {
return (*s == '\0') ? 0 : 1 + my_strlen_rec(s + 1);
}
strlen;記憶體操作(malloc、memcpy、陣列長度)用 sizeofsizeof 計算緩衝區大小-Wall -Wextra)捕捉常見誤用