Форум программистов, компьютерный форум CyberForum.ru

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

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

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

03.07.2016, 15:44. Просмотров 220. Ответов 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;
}
Вопрос, почему так работает? Вернули же указатель на локальный объект... Адрес строки был в стеке и после выхода из функции должен был освободиться. Правильно?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2016, 15:44     Возврат указателя на локальный объект
Посмотрите здесь:

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
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.
yrceus
82 / 82 / 54
Регистрация: 25.08.2013
Сообщений: 326
03.07.2016, 15:53  [ТС]     Возврат указателя на локальный объект #3
Спасибо за полный ответ! Понял!))))
meJevin
155 / 147 / 58
Регистрация: 18.11.2015
Сообщений: 644
Завершенные тесты: 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. Т.е. его перезаписать нельзя. Или я пургу несу и ничего не понял
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++
Что-то ни как не могу разобраться, где у меня ошибка?! Ниже приведен фрагмент кода: //... shapes *ptr=0; //ptr - указатель базового...

Присвоение переменной поля указателя на объект - C++
Инициализация: Dragons* dragon; for (int i = 0; i &lt;= 99; i++) { dragon = new Dragons(random(50), random(40), 3,8); } ...

Указатель на объект из указателя на член класса - C++
Что как-то сей вопрос ставит меня в тупик. class A { int i; } obj; int main()


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

Или воспользуйтесь поиском по форуму:
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
03.07.2016, 16:22     Возврат указателя на локальный объект #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
meJevin, в первом примере от автора UB нет. Там адрес строкового литерала используется для инициализации указателя.
В моем примере UB есть, потому что там создается массив на стеке, для инициализации которого используется строковый литерал, а в массиве соответственно копия этого литерала.
Yandex
Объявления
03.07.2016, 16:22     Возврат указателя на локальный объект
Ответ Создать тему
Опции темы

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