0

谁能解释以下代码如何工作并且不会使应用程序崩溃?

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为 char 指针中的额外字符分配内存?
  2. 还想知道将数据从stringstreamchar* 数组复制到不超过分配的内存的正确方法char*
4

2 回答 2

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!

希望有帮助。

于 2013-03-28T12:55:20.367 回答
1
  1. 不。你覆盖了内存,调用了未定义的行为,但没有发生任何明显的事情,所以错误没有被注意到。没有要求做这样的事情应该触发任何人类可见的错误或特殊动作,因此措辞undefined behavior
  2. 您将不得不逐块进行,char如果空间不足,则重新分配数组。在 C++ 中,手动执行此操作毫无意义。只需使用std::string并完成。
于 2013-03-28T12:54:05.577 回答