| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Возврат функцией указателя на строку |
| Автор: Solitario 13.1.2008, 16:00 | ||||
| Помогите,пожалуйста, разобраться со следующий проблемой: Необходимо преобразовать строку в функции, расположенной в отдельном классе:
P - соответствующий класс, char* ChangeKey(char *c) - метод,который изменяет строку, с - указатель на строку.
Проблема в том,что в текстовое поле,которому приравнивается значение s, возвращается подобная ерунда: ~"zюэf7€зy н |
| Автор: Lazin 13.1.2008, 16:06 |
| переменная cval удаляется при выходе из ф-ии CPreobraz::ChangeKey, что-бы это не происходило нужно пользоваться выделять память с помощью new, или пользоваться std::string |
| Автор: maxim1000 13.1.2008, 16:11 |
| char * - указатель на место в памяти исторически сложилось так, что он используется для представления строк, но это - не строка в чистом виде то, что это указатель, просвечивает при операциях с ним: при копировании получаем указатель на то же место, а не новую строку в данном случае локальный массив cval размещается в стеке, а это значит, что при выходе из функции эта же память может использоваться для других целей, т.е. там будет другая информация вот она и портится раз уж тут мы имеем дело с C++, я бы посоветовал использовать std::string - этот класс специально и разработан для того, чтобы обращаться со строкой, как с обычным значением - копирование, изменение, совпадающее с интуитивным представлением о том, как это должно быть |
| Автор: Solitario 13.1.2008, 16:43 |
| Спасибо за оперативную помощь Проблема решилась выделением памяти через new. Решал эту задачу через std::string, но интересно было справиться с ней средствами языка C. |
| Автор: maxim1000 13.1.2008, 17:20 |
ну тогда и с последующим delete в C часто испольуется другой подход: передаётся указатель на место, куда записать результат (например, strcpy) просто общая рекомендация состоит в том, чтобы не сильно разносить выделение и освобождение памяти, а то если функция внутри себя выделяет память, а имя не содержит на это указаний (типа Create...), не всегда легко поймать место, где забыли выделить память кроме того, в каждой программе есть два способа выделения памяти: в стеке и в куче, а в некоторых и больше, если памяти слишком активно используется, так что не всегда фиксирование способа выделения памяти приемлимо в функции |