核心差異一覽
| 特性 | sizeof | strlen |
| 性質 | **運算子**(編譯期計算) | **函式**(執行期計算) |
| 單位 | 位元組 | 字元數(不含結束符) |
| 參數 | 型別或表達式 | const char*(以 '\0' 結尾) |
| 陣列參數 | 回傳整個陣列大小 | 退化為指標,回傳字串長度 |
| 指標參數 | 回傳指標大小(4/8 位元組) | 回傳字串長度 |
| 結構體 | 含對齊填充的總大小 | 不適用 |
經典範例
char str[] = "Hello"; // 6 位元組(含 \0)
char *ptr = str;
sizeof(str); // 6
sizeof(ptr); // 4 (32位) 或 8 (64位)
strlen(str); // 5
strlen(ptr); // 5
// 結構體
struct S { char c; int i; };
sizeof(S); // 8 (對齊填充)
常見誤區
- 以為 sizeof(char*) 等於字串長度 —— 實際是指標大小。
- 函式參數為陣列時 sizeof 失效 —— 參數退化為指標,
void f(char a[100]) { sizeof(a); } 回傳指標大小。
- strlen 讀取非 '\0' 結尾緩衝區 —— 未定義行為,可能越界讀取。
最佳實務
- 需要**物件佔用記憶體大小**(配置、序列化、memcpy)用
sizeof。
- 需要**字串可見字元長度**(顯示、解析、複製)用
strlen(確保以 '\0' 結尾)。
- C++ 優先使用
std::string / std::vector,其 .size() 語意明確且安全。