Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Возврат функцией указателя на строку 
V
    Опции темы
Solitario
Дата 13.1.2008, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 13.1.2008

Репутация: нет
Всего: нет



Помогите,пожалуйста, разобраться со следующий проблемой:
Необходимо преобразовать строку в функции, расположенной в отдельном классе:
Код

char* s = P.ChangeKey(c);

P - соответствующий класс, char* ChangeKey(char *c) - метод,который изменяет строку, с - указатель на строку.
Код

char* CPreobraz::ChangeKey(char *c)
{
char cval[40]="";
// код изменения строки
// новая строка записывается в cval
return cval;
}

Проблема в том,что в текстовое поле,которому приравнивается значение s, возвращается подобная ерунда:
~"zюэf7€зy н
PM MAIL   Вверх
Lazin
Дата 13.1.2008, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



переменная cval удаляется при выходе из ф-ии CPreobraz::ChangeKey, что-бы это не происходило нужно пользоваться выделять память с помощью new, или пользоваться std::string
PM MAIL Skype GTalk   Вверх
maxim1000
Дата 13.1.2008, 16:11 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



char * - указатель на место в памяти
исторически сложилось так, что он используется для представления строк, но это - не строка в чистом виде
то, что это указатель, просвечивает при операциях с ним: при копировании получаем указатель на то же место, а не новую строку
в данном случае локальный массив cval размещается в стеке, а это значит, что при выходе из функции эта же память может использоваться для других целей, т.е. там будет другая информация
вот она и портится
раз уж тут мы имеем дело с C++, я бы посоветовал использовать std::string - этот класс специально и разработан для того, чтобы обращаться со строкой, как с обычным значением - копирование, изменение, совпадающее с интуитивным представлением о том, как это должно быть


Это сообщение отредактировал(а) maxim1000 - 13.1.2008, 16:12


--------------------
qqq
PM WWW   Вверх
Solitario
Дата 13.1.2008, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 13.1.2008

Репутация: нет
Всего: нет



Спасибо за оперативную помощь smile  
Проблема решилась выделением памяти через new. Решал эту задачу через std::string, но интересно было справиться с ней средствами языка C. 
PM MAIL   Вверх
maxim1000
Дата 13.1.2008, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Цитата(Solitario @  13.1.2008,  16:43 Найти цитируемый пост)
Проблема решилась выделением памяти через new

ну тогда и с последующим delete smile


Цитата(Solitario @  13.1.2008,  16:43 Найти цитируемый пост)
но интересно было справиться с ней средствами языка C.

в C часто испольуется другой подход: передаётся указатель на место, куда записать результат (например, strcpy)

просто общая рекомендация состоит в том, чтобы не сильно разносить выделение и освобождение памяти, а то если функция внутри себя выделяет память, а имя не содержит на это указаний (типа Create...), не всегда легко поймать место, где забыли выделить память

кроме того, в каждой программе есть два способа выделения памяти: в стеке и в куче, а в некоторых и больше, если памяти слишком активно используется, так что не всегда фиксирование способа выделения памяти приемлимо в функции


--------------------
qqq
PM WWW   Вверх
DigitSphinx
Дата 14.1.2008, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 28.4.2007
Где: Москва

Репутация: 1
Всего: 3



Цитата(Solitario @  13.1.2008,  16:43 Найти цитируемый пост)
Решал эту задачу через std::string, но интересно было справиться с ней средствами языка C. 

если не ошибаюсь, то new delete так как и std::string относится к С++ а не к С, так что если выделять память то через malloc free, так что лучше заранее выделить память затем передать указатель куда надо записать строку и копировать ее туда через strcpy
и не будет проблем о которых говорил maxim1000  smile 

Это сообщение отредактировал(а) DigitSphinx - 14.1.2008, 10:02


--------------------
Чтобы пробить стену лбом нужен или большой разбег, или много лбов.
(Альберт Эйнштейн)
Умен ты или глуп, велик ты или мал, не знаем мы, пока ты слова не сказал.
(Альберт Эйнштейн)
user posted image
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0712 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.