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
- Сделал
stringstream
выделить память для дополнительных символов в указателе символа? - Также хочу знать, как правильно копировать данные из
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!
Надеюсь, это поможет.
- Нет. Вы перезаписали память, вызвав неопределенное поведение, но ничего очевидного не произошло, поэтому ошибка осталась незамеченной. Не требуется, чтобы выполнение чего-то подобного вызывало какие-либо видимые человеком ошибки или специальные действия, таким образом формулируя неопределенное поведение.
- Вам придется делать это по частям и перераспределять
char
массив, если ему не хватает места. В C++ нет никакого смысла делать это вручную. Просто используйтеstd::string
и будет сделано.