通过stringstream为char *分配编号

时间:2014-09-05 20:14:31

标签: c++ stringstream

任何人都可以向我解释为什么这段代码无法将c1指向的内存分配给55,而对于c2却是如此?分配给c1的代码看起来与c2做的工作相同,但步骤较少。

#include <sstream>
#include <string>

int main ()
{
    std::stringstream ss;
    ss << 55;

    const char* c1 = ss.str().c_str(); // *c1 = \0

    // looks to be doing the same, but in stages
    std::string s = ss.str();
    const char* c2 = s.c_str(); // *c2 = "55"
}

2 个答案:

答案 0 :(得分:2)

str()是临时的,因此在语句结束时会被破坏。那时c1将是一个悬空指针。与std::string初始化之间的区别在于std::string的构造函数将复制字符,直到'\0'进入其缓冲区。

答案 1 :(得分:0)

在第一个版本中:     const char * c1 = ss.str()。c_str(); 指定c1指向流ss内的内部缓冲区。

第二个版本:     std :: string s = ss.str(); 将整个缓冲区复制到字符串s中。 然后     const char * c2 = s.c_str(); 指定c2指向字符串s中的内部缓冲区。

此时,这两个指针将指向包含相同字符的不同缓冲区。 如果向流ss写入了其他内容,则可以重新分配其缓冲区。 在这种情况下,c1将指向无效内存,而c2仍将指向字符串s中的有效缓冲区。