Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.01.2023, 23:54   #1
jemand
Пользователь
 
Регистрация: 22.05.2015
Сообщений: 13
По умолчанию возвращаю указатель из функции на локальную переменную в функции

Здравствуйте, возвращаю указатель в СИ из функции на локальную переменную в функции и могу добраться до переменной, почему так?
Код:
int* test()
{
    int k = 1;
    int* pk = &k;
    return pk;
}

int main()
{
   int* pk = test();
   printf("%d", *pk);
   return 0;
}

1
Process returned 0 (0x0)   execution time : 0.083 s
Press any key to continue.
среда Code:Blocks

Последний раз редактировалось jemand; 07.01.2023 в 23:56.
jemand вне форума Ответить с цитированием
Старый 08.01.2023, 01:25   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Давайте чуть усложним и значение будет стерто
Код:
#include "stdio.h"

void test2(int i)
{
    printf("%d", i);
}

void test1(int a, int *i)
{
    test2(*i);
}

int *test(int val)
{
  int k = val;
  int *pk = &k;
  return pk;
}

int main(int argc, char* argv[])
{
    int *pk = test(1);
    test1(0, pk);
    return 0;
}
Цитата:
Program returned: 0
Program stdout

32765
Но если убрать параметр int a, тогда затирания не произойдет.

Подробнее смотрите описания работы со стеком (см. вложение)
Вложения
Тип файла: txt stack.txt (22.5 Кб, 4 просмотров)
macomics вне форума Ответить с цитированием
Старый 08.01.2023, 07:17   #3
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 965
По умолчанию

Цитата:
Сообщение от jemand Посмотреть сообщение
возвращаю указатель в СИ из функции на локальную переменную в функции
при разыменовании такого висячего указателя в программе появляется UB. Программа не будет работать так, как ожидается.
Алексей1153 вне форума Ответить с цитированием
Старый 12.01.2023, 22:17   #4
maks1331
Форумчанин
 
Аватар для maks1331
 
Регистрация: 20.12.2016
Сообщений: 270
По умолчанию

Просто твоя маленькая программа не успела переписать память, на которую указывает указатель. По факту, для ОС эта память свободная.
формошлеп.рф
witech.su
maks1331 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как передать переменную из одной функции в другую функции rustamcom2 PHP 7 14.03.2017 14:48
Сборщик мусора не удаляет локальную переменную BleStaR Общие вопросы по Java, Java SE, Kotlin 4 05.04.2016 14:33
Указатель и шаблонные функции kineziz Общие вопросы C/C++ 4 16.07.2012 14:59
Можно ли задать глобальную переменную из функции или как-то напрямую использовать память для хранения переменных из функции? Suny-o Общие вопросы Delphi 2 14.06.2012 11:45
Указатель на шаблон функции Syuf Общие вопросы C/C++ 3 29.04.2010 22:20