2016-07-08 76 views
-3

我不知道這裏有什麼問題。C++從stringstream中檢索const char *

std::stringstream ss("Title"); 
ss << " (" << 100 << ")"; 
const char* window_title = &ss.str().c_str(); 

我跑make,它並不高興。

[17%] Building CXX object CMakeFiles/game.dir/src/main.cpp.o 
path: error: cannot take the address of an rvalue of type 'const value_type *' 
     (aka 'const char *') 
      const char* window_title = &ss.str().c_str(); 
            ^~~~~~~~~~~~~~~~~ 
1 error generated. 
make[2]: *** [CMakeFiles/game.dir/src/main.cpp.o] Error 1 
make[1]: *** [CMakeFiles/game.dir/all] Error 2 
make: *** [all] Error 2 

據我瞭解,我創建字「標題」一個stringstream,然後追加「(100)」來了。在此之後,我檢索一個字符串,然後是一個「C字符串」,它是一個char並將指針存儲在window_title中。

怎麼了?

+5

不要垃圾郵件標籤! C不是C++不是C! – Olaf

+2

你不需要把地址'ss.str().c_str();''已經返回'const char *'。 –

+0

呃,爲什麼我得到10k的降價?我解釋了這個問題,不是嗎? – Lolums

回答

4

ss.str()返回一個在調用後被銷燬的臨時對象。你不應該使用臨時對象的內存指針,這是未定義的行爲。另外,c_str()已經返回一個指向空終止字符數組的指針。編譯器抱怨說你不是簡單地使用地址來存儲臨時對象的內存,而是指向這個地址,正確地如此。這樣它編譯和工作

std::stringstream ss("Title"); 
ss << " (" << 100 << ")"; 
//Create a string object to avoid using temporary object 
std::string str = ss.str(); 
const char* window_title = str.c_str(); 
+0

啊,我明白這一點,但它會導致錯誤鏈接:http://pastebin.com/raw/NpbD7FCJ - 這是我的錯嗎? (由於環境?) – Lolums

+0

@Lolums你是否包含''標題? – buld0zzr

+0

好的。我真笨。謝謝! – Lolums