Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
yrceus
82 / 82 / 54
Регистрация: 25.08.2013
Сообщений: 326
#1

Возврат указателя на локальный объект - C++

03.07.2016, 15:44. Просмотров 256. Ответов 4
Метки нет (Все метки)

Доброго дня! Заинтересовал процесс возврата указателя на локальный объек, а именно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
char* fun() {
    char *ptr1 = "Hello world!";
    return ptr1;
}
 
 
int main()
{
    char *ptr = fun();
    cout << ptr << end;
    return 0;
}
Вопрос, почему так работает? Вернули же указатель на локальный объект... Адрес строки был в стеке и после выхода из функции должен был освободиться. Правильно?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2016, 15:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Возврат указателя на локальный объект (C++):

Возврат указателя - C++
Написать функцию возвращающую ссылку на элемент глобального массива. #include &lt;stdio&gt; #include &lt;conio&gt; #include &lt;iostream&gt; ...

Возврат указателя на строку из фукнции - C++
Снова я пришел к вам со строками. Читаю &quot;Как программировать на С++&quot; и там везде пишут про инкапсуляцию, сокрытие данных. Так чтоб мы...

Возврат указателя на массив из функции - C++
День добрый, коллеги по цеху. Не откажите в нужде java программисту в познаниях нативного кода. Запутался я совсем в указателях. Как...

Возврат указателя на массив из функции - C++
Здравствуйте. Пытаюсь вернуть указатель на массив из функции. #include &lt;iostream&gt; using namespace std; int*...

Возврат указателя на массив указателей - C++
Доброго времени суток. Есть программа, где куча методов должны работать с одни массивом указателей. Как мне сделать, чтобы в функции...

Возврат функцией указателя на функцию - C++
Всем привет! У меня возникла такая проблема: класс имеет поле-указатель на функцию. В методе, который осуществляет доступ к этуму полю,...

4
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
03.07.2016, 15:52 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
yrceus, здесь нет локального объекта, кроме самого указателя, который естественно копируется при возврате. Строковый литерал имеет статическое размещение (static storage duration) и живет до конца выполнения программы.

Добавлено через 2 минуты
А вот так делать как раз нельзя:
C++
1
2
3
4
char* fun() {
    char arr[] = "Hello world!";
    return arr;
}
Здесь у нас локальный массив, адрес первого элемента возвращается из функции. Вот здесь действительно будет UB.
6
yrceus
82 / 82 / 54
Регистрация: 25.08.2013
Сообщений: 326
03.07.2016, 15:53  [ТС] #3
Спасибо за полный ответ! Понял!))))
0
meJevin
156 / 148 / 58
Регистрация: 18.11.2015
Сообщений: 672
Завершенные тесты: 1
03.07.2016, 16:14 #4
DrOffset, а почему UB? У него же static storage duration, он сидит в одном блоке памяти до конца программы. Еще говорят, что most likely, string literals will be stored in read-only segments of memory since they never change. Т.е. его перезаписать нельзя. Или я пургу несу и ничего не понял
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
03.07.2016, 16:22 #5
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
meJevin, в первом примере от автора UB нет. Там адрес строкового литерала используется для инициализации указателя.
В моем примере UB есть, потому что там создается массив на стеке, для инициализации которого используется строковый литерал, а в массиве соответственно копия этого литерала.
3
03.07.2016, 16:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2016, 16:22
Привет! Вот еще темы с ответами:

Visual c++ возврат указателя, return *char - C++
есть класс journal, Я передаю в char *name значение &quot;gfg&quot;, а возвращает от мне заименнованное значение name, только первый символ &quot;f&quot;. ...

Происхродит ли здесь возврат указателя на не действительную память? - C++
double *Gaus(double **Matix, double *Frees, int N) { double **DownRow; double *DownFree; int i; double **UpnRow; double...

Возвращение ссылки на локальный объект - C++
В каком-то коде мельком видел что-то вроде: char&amp; char_stub() { char c; return c; }; int main() {

Возвращение ссылки на локальный объект - C++
int&amp; foo() { int a; //: warning C4172: возвращение адреса локальной или временной переменной return a; } ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru