理解為什麼回傳字串的函數上的std::string.c_str() 失敗
在C 中,當函數傳回字元串時,它是按值這樣做的。這意味著傳回的字串是原始字串的副本,而不是對其的引用。這與預設情況下透過引用傳回的其他內建類型(例如整數或浮點數)的行為不同。
在您的範例中,函數 getString() 傳回字串對象,該物件是一個副本字串「你好」。該副本儲存在記憶體中的暫存位置。該行 const char* cStr = getString().c_str();嘗試取得表示傳回字串的 C 風格字串。然而,由於臨時字串已經被銷毀,指標 cStr 現在指向無效記憶體。
臨時物件的銷毀
此行為的解釋在於C 中臨時物件的規則。臨時對像是編譯器隱含建立的對象,以避免不必要的複製。在您的情況下, getString() 建立的臨時字串是一個臨時物件。
臨時物件在建立它們的完整表達式結束時被銷毀。完整表達式是不是其他表達式的子表達式的表達式。在您的範例中,行 const char* cStr = getString().c_str();是一個完整的表達式。因此,由 getString() 建立的臨時字串將在此行末尾被銷毀。
防止問題
要防止此問題,您有多種選擇:
遵循這些準則,您可以避免與懸空指標相關的問題並確保您的程式碼行為正確。
以上是## 為什麼 `std::string.c_str()` 在 C 語言中用來傳回字串的函式時會失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!