【问题标题】:C++ stringstream to char* conversion memory allocationC++ stringstream 到 char* 转换内存分配
【发布时间】:2024-05-01 10:00:02
【问题描述】:

谁能解释以下代码的工作原理以及不会使应用程序崩溃吗?

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. 还想知道将数据从stringstream 复制到char* 数组的正确方法,而不超出为char* 分配的内存?

【问题讨论】:

    标签: c++ arrays memory-management stringstream istringstream


    【解决方案1】:

    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!
    

    希望对您有所帮助。

    【讨论】:

    • 我们也可以sstream &lt;&lt; stemp吗?
    • 是的,因为输入和输出都是stringstream
    • 我有一个要求,不能使用字符串。所以唯一的方法是使用 istream::read 并指定你的 char 数组的最大长度。谢谢。
    • 实际上我在macro 中使用&gt;&gt; operator 读取integerchar* 数据类型。有没有办法在不为integerchar* 做不同的情况下仍然做到这一点。
    • @N3Xg3N:我没听懂你在说什么? macro 这里是什么?在 ideone.com 或 pastebin.com 上发布您的代码
    【解决方案2】:
    1. 没有。你覆盖了内存,调用了未定义的行为,但没有发生任何明显的事情,所以错误没有被注意到。没有要求做这样的事情应该触发任何人类可见的错误或特殊动作,因此措辞未定义的行为
    2. 您将不得不逐块进行,如果空间不足,则重新分配char 数组。在 C++ 中,手动执行此操作毫无意义。只需使用 std::string 即可完成。

    【讨论】: