2016-07-08 35 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