Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Возврат функцией указателя на строку


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

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 н

Автор: 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
Спасибо за оперативную помощь smile  
Проблема решилась выделением памяти через new. Решал эту задачу через std::string, но интересно было справиться с ней средствами языка C. 

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

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


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

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

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

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)