Здравствуйте, indee, Вы писали:
I>Почему mystr пустая и длина = 0 (mystr.length())?
У тебя в программе неопределённое поведение. Оно может проявляться множеством способов, в том числе и таким.
Когда ты записываешь что-то в буфер строки
s напрямую, то запись можно делать только в область памяти от
s.data() до
s.data()+s.size() причём в последнюю позицию
s.data()+s.size() можно записывать только
'\0'.
В функции
test это требование нарушается и запись идёт за пределы этого диапазона, перезатирая чужие данные.
| Скрытый текст |
| Технически, длина строки mystr не меняется и остаётся нулём, так как она хранится отдельно и от содержимого буфера [ s.data(), s.data()+s.size() ] не зависит. А функция test никак не обновляет размер. Но это деталь реализации. И она не особо важна, пока в программе есть неопределённое поведение. |
| |
I>// mystr = mystr.c_str(); после этого все ОК
I>// std::cout << mystr << " Length = " << mystr.length() << std::endl;mystr = mystr.c_str();
Что ты тут подразумеваешь, говоря что "все ОК"?
То что дальше
программа иногда выводит мусор вместо исходной строки, а иногда падает?