2013-03-28 55 views
0

谁能解释一下下面的代码是如何工作的,并不会应用程序崩溃?C++字符串流为char *转换内存分配

int main() { 
    char *tempStr = new char[5]; 
    tempStr[0] = '\0'; 
    string stemp = "helloworld"; 
    stringstream sstream; 
    sstream.str(stemp); 
    cout << "len before = " << strlen(tempStr); 
    sstream >> tempStr; 
    cout << "len after = " << strlen(tempStr) << endl; 
    cout << tempStr << endl; 
    delete[] tempStr; 
    return 1; 
} 

我得到的输出作为

len before = 0 
len after = 10 
helloworld 
  1. 没有stringstream在字符指针多余的字符分配内存?
  2. 也想知道正确的方式从stringstream复制数据到char *数组,不超过分配给char*内存?

回答

3

Stringstream是否为char指针中的额外字符分配内存?

号你的代码调用未定义的行为。

也想知道正确的方法来从stringstream复制数据到char *数组,而不会超过分配给char *的内存?

这是不是一个好主意,读入char*。使用std::string从流中读取输入。但如果你仍然想知道知识的缘故,请使用std::istream::read()

if (sstream.read(tempStr, 5)) 
{ 
    //read succeeded 
} 

顺便说一句,你可以合并这两条线:

stringstream sstream; 
sstream.str(stemp); 

成一个:

stringstream sstream(stemp); 

或简单:

stringstream sstream("helloworld"); //no need of stemp! 

希望有所帮助。

+0

我们还可以做's stemp'吗? – 0x499602D2

+0

是的,因为它是用于输入和输出的'stringstream'。 – Nawaz

+0

我有一个要求,不能使用字符串。所以唯一的方法是使用'istream :: read'并指定char数组的最大长度。谢谢。 – N3Xg3N

1
  1. 号您已改写存储,调用未定义的行为,但没有明显的发生了,所以错误置若罔闻。有没有这样做这样的事情应该引起任何人可见的错误或专项行动,因此措辞不确定的行为要求。
  2. 你就必须把块做块,如果它运行的空间重新分配char阵列。在C++中,手动执行此操作几乎没有意义。只需使用std::string即可完成。
+0

确定,所以没有新的内存分配。谢谢。 – N3Xg3N