理解Stringstream、String 和char* 轉換
程式設計中常見的困惑涉及stringstream、string 和char 之間的互動 轉換。本文旨在闡明從stringstream.str().c_str() 返回的字串駐留在記憶體中的位置以及為什麼它不能直接分配給const char.
當使用stringstream 時,str ( ) 函數傳回一個臨時字串對象,該對象僅存在於呼叫它的表達式中。該字串物件通常在堆疊上創建,並在表達式結束後被銷毀。
讓我們檢查提供的程式碼範例:
#include <string> #include <sstream> #include <iostream> using namespace std; int main() { stringstream ss("this is a string\n"); string str(ss.str()); const char* cstr1 = str.c_str(); const char* cstr2 = ss.str().c_str(); cout << cstr1 // Prints correctly << cstr2; // ERROR, prints out garbage system("PAUSE"); return 0; }
當我們嘗試指派結果時,就會出現問題stringstream.str().c_str() 到 const char* cstr2。由於傳回的字串是臨時的,因此在表達式結束後它會被銷毀,從而使 cstr2 指向懸空指標。因此,列印 cstr2 會導致垃圾。
解決問題:
為了避免這個問題,我們可以將臨時字串複製到永久字串物件並取得其C 風格字串或將臨時字串綁定到const 引用,延長其生命週期:
// Copy to a permanent string const std::string tmp = stringstream.str(); const char* cstr = tmp.c_str(); // Bind to a const reference { const std::string& tmp = stringstream.str(); const char* cstr = tmp.c_str(); }
在修改後的程式碼範例中,兩者cstr 和cstr2 指向在const字串物件的生命週期中存在的有效 C 風格字串。因此,兩個字串都可以正確列印。
需要注意的是,通常首選將臨時字串綁定到 const 引用,因為它可以避免不必要的複製,並提供更有效率、更簡潔的解決方案。
以上是為什麼將 stringstream.str().c_str() 指派給 const char* 會導致懸空指針,如何解決這個問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!