Другие языки программирования и технологии

c++ возврат char из функции

Пожалуйста помогите привести в рабочему виду ...или как правильно возвращать указатель(ссылку на память) на char из функции?? ====== #include<iostream> using namespace std; char * func() { char g[]={'А','G'}; return &g[0]; } int main(int argc,char * argv[]) { cout << func() << endl; }
Виталя В.
Виталя В.
3 181
Два замечания.

(1) Ваша программа будет иметь неопределённое поведение, потому что возвращать из функции указатель на локальную переменную нельзя. После выхода из функции участок памяти, занятый локальной переменной, освобождается и может быть использован системой для чего угодно. Если Вам повезёт и система ещё не успеет переиспользовать этот участок памяти, то Вы даже можете получить правильные результаты. Но полагаться на это нельзя. Если Вы уж обязательно хотите вернуть из функции char *, то надо внутри функции аллокировать память с помощью оператора new (ну или malloc, если в С) . Пример Вам привёл DarkLostSoul.

(2) Сама идея возвращения char * из функции совершенно не соответствует духу С++. Это штучки из С. В С++ надо избегать манипуляций низкого уровня, к котором относятся и манипуляции с char *. Вместо этого надо работать с std::string, классом, который для того и создан, чтобы облегчить жизнь и избежать многочисленных ошибок (вроде Вашей) , которые так легко сделать в низкоуровневых операциях.
Алексей Показаньев
Алексей Показаньев
43 607
Лучший ответ
Это вариант "втупую":

char* func()
{
char* str = new char[10];
sprintf(str, "%s","ABC");
return str;
}
Павел Бородин Этот "тупой" вариант - вызывает утечку памяти!!! Не пользуйтесь им!!!
#include < iostream >
using namespace std;
char *func()
{
char arr[]={'a','b','c'};
return arr+1;
//return &arr[1]; //и так можно
}
int main()
{
cout < < *func() < < endl; //нужно разыменовывать *
return 0;
}
Саня Пасюков
Саня Пасюков
9 759
насколько помню ссылку с массивами использовать нельзя, попробуй указатель