2013-01-17 233 views
1

我一定在这里错过了一个显而易见的事实 - 有一段时间没有编程C++。为什么不能在将c风格字符串分配给const char *变量后打印它?但是,如果我尝试直接打印,无需进行指定正常工作:C++ const char *指针赋值

#include "boost/lexical_cast.hpp" 

using namespace std; 
using boost::lexical_cast; 

int main (int argc, char** argv) 
{ 
    int aa=500; 
    cout << lexical_cast<string>(aa).c_str() << endl; // prints the string "500" fine 

    const char* bb = lexical_cast<string>(aa).c_str(); 
    cout << bb << endl;         // prints nothing 

    return EXIT_SUCCESS; 
} 
+0

[打印500!](http://ideone.com/A0tuqQ) –

+0

@MarkGarcia:这是未定义的行为。所以做你期望它是一个完美的实现选项。 –

+0

@BenjaminLindley当然。只显示一个真实的输出。 :) –

回答

5

通过c_str返回的C字符串只能用于在从那里得到了std::string存在。一旦std::string被销毁,C字符串也不见了。 (此时尝试使用C字符串会产生未定义的行为。)

其他操作也可能使C字符串无效。一般来说,任何修改该字符串的操作都将使由c_str返回的指针无效。

+0

啊,我现在看到了。这是有道理的,否则如果c_str()返回一个放在堆上的数据,它会在任何地方变成memleak。非常感谢 – gerrytan

3

c_strlexical_cast创建的临时string的结果调用函数。由于不保存它,因此该字符串在该表达式的末尾被销毁,因此访问已销毁字符串的指针c_str是未定义的行为。