![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Solitario |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 13.1.2008 Репутация: нет Всего: нет |
Помогите,пожалуйста, разобраться со следующий проблемой:
Необходимо преобразовать строку в функции, расположенной в отдельном классе:
P - соответствующий класс, char* ChangeKey(char *c) - метод,который изменяет строку, с - указатель на строку.
Проблема в том,что в текстовое поле,которому приравнивается значение s, возвращается подобная ерунда: ~"zюэf7€зy н |
||||
|
|||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
переменная cval удаляется при выходе из ф-ии CPreobraz::ChangeKey, что-бы это не происходило нужно пользоваться выделять память с помощью new, или пользоваться std::string
|
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
char * - указатель на место в памяти
исторически сложилось так, что он используется для представления строк, но это - не строка в чистом виде то, что это указатель, просвечивает при операциях с ним: при копировании получаем указатель на то же место, а не новую строку в данном случае локальный массив cval размещается в стеке, а это значит, что при выходе из функции эта же память может использоваться для других целей, т.е. там будет другая информация вот она и портится раз уж тут мы имеем дело с C++, я бы посоветовал использовать std::string - этот класс специально и разработан для того, чтобы обращаться со строкой, как с обычным значением - копирование, изменение, совпадающее с интуитивным представлением о том, как это должно быть Это сообщение отредактировал(а) maxim1000 - 13.1.2008, 16:12 -------------------- qqq |
|||
|
||||
| Solitario |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 13.1.2008 Репутация: нет Всего: нет |
Спасибо за оперативную помощь
Проблема решилась выделением памяти через new. Решал эту задачу через std::string, но интересно было справиться с ней средствами языка C. |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
ну тогда и с последующим delete в C часто испольуется другой подход: передаётся указатель на место, куда записать результат (например, strcpy) просто общая рекомендация состоит в том, чтобы не сильно разносить выделение и освобождение памяти, а то если функция внутри себя выделяет память, а имя не содержит на это указаний (типа Create...), не всегда легко поймать место, где забыли выделить память кроме того, в каждой программе есть два способа выделения памяти: в стеке и в куче, а в некоторых и больше, если памяти слишком активно используется, так что не всегда фиксирование способа выделения памяти приемлимо в функции -------------------- qqq |
|||
|
||||
| DigitSphinx |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 442 Регистрация: 28.4.2007 Где: Москва Репутация: 1 Всего: 3 |
если не ошибаюсь, то new delete так как и std::string относится к С++ а не к С, так что если выделять память то через malloc free, так что лучше заранее выделить память затем передать указатель куда надо записать строку и копировать ее туда через strcpy и не будет проблем о которых говорил maxim1000 Это сообщение отредактировал(а) DigitSphinx - 14.1.2008, 10:02 |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |