C++ 通过stringstream为char*分配编号

C++ 通过stringstream为char*分配编号,c++,stringstream,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 doi

有人能向我解释一下为什么这个代码不能将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"
}
#包括
#包括
int main()
{
std::stringstream-ss;
ss
str()
是临时的,因此在语句结束时它将被销毁。此时
c1
将是一个悬空指针。这与使用
std::string
初始化的区别在于
std::string
的构造函数将复制字符,直到
'\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中的有效缓冲区。

/*c1=\0
你怎么知道?问题似乎并不在于你认为它是什么地方……这里工作正常:我刚刚尝试了这个,得到了c1:c2:55。下面的Rudy也得到了与你相同的结果。我想知道这个编译器是特定的吗?我明白了。感谢您的解释,原因是:
c3
在删除临时文件之前将文本复制到其内部缓冲区。FWIW,在我的设置中,
c1
c2
都产生
“55”
。是的,回答此问题的其他人也会得到55分。这取决于编译器吗?@user1408542,如果您试图取消对未定义行为的悬挂指针的引用(通过打印指针或其他方式)。您的编译器根本不必输出任何内容。如果需要,它可能会朝您的脸上吐出来。:)