C++ stringstream в 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*?

2 ответа

Решение

Выделил ли stringstream память для дополнительных символов в указателе символа?

Нет. Ваш код вызывает неопределенное поведение.

Также хотите узнать правильный способ копирования данных из 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!

Надеюсь, это поможет.

  1. Нет. Вы перезаписали память, вызвав неопределенное поведение, но ничего очевидного не произошло, поэтому ошибка осталась незамеченной. Не требуется, чтобы выполнение чего-то подобного вызывало какие-либо видимые человеком ошибки или специальные действия, таким образом формулируя неопределенное поведение.
  2. Вам придется делать это по частям и перераспределять char массив, если ему не хватает места. В C++ нет никакого смысла делать это вручную. Просто используйте std::string и будет сделано.
Другие вопросы по тегам