`c_str()` 返回 `const char*`,指向 string 內部緩衝區(以 `\0` 結尾)。
string 不會因調用 c_str 而析構。string 的析構由其作用域決定(如局部變量離開作用域、delete、vector 清空等)。
危險場景:指針存活期超過 string 對象:
const char* dangerous() {
std::string s = "1234";
return s.c_str(); // 錯誤!s 即將析構,返回指針懸空
}
函數返回時 `s` 析構,內部緩衝區釋放,返回指針指向無效內存。雖可能短期內未被覆蓋而「偶然」能讀,但屬未定義行為,極其危險。
C++17 `string::data()` 返回非 const 指針,允許修改內部緩衝區(但不可改變長度),`c_str()` 仍保持 const 語義。
`c_str()` 返回內部緩衝區只讀指針,生命週期綁定 string 對象。切勿讓指針逃逸出 string 作用域,需長期用請拷貝。