Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
12 / 12 / 5
Регистрация: 03.06.2016
Сообщений: 169

Область видимости

13.04.2019, 15:44. Показов 1274. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Вот кусок кода
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int *s;
int *m()
{
    int k = 12345;
    s = &k;
    return &k;
}
int main()
{
    int *d = m();
    std::cout << *d<<std::endl;
    std::cout << *s << std::endl;
    std::cout << d << std::endl;
    std::cout << s << std::endl;
    system("pause");
    return 0;
}
выход
Code
1
2
3
4
5
12345
-858993460
0000000C07EFFC44
0000000C07EFFC44
Для продолжения нажмите любую клавишу . . .
Почему переменная *d выводит числа 12345? int k = 12345; создана локально и после завершения метода m() должна удалятся, но нет она продолжает жить, а указатель s вроде как ведет себя правильно.
К тому же указатели s и d указывают на одно и тоже место.

ПС Компилятор MSVC
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.04.2019, 15:44
Ответы с готовыми решениями:

Область видимости
Здравствуйте. Тут такое дело: #include &lt;vector&gt; class SomeClass { public: SomeClass( std::vector&lt; int &gt; v ) : vec( v ) {}...

Область видимости
У меня возникла проблема с областью видимости. вот у меня два класса class Obj { public: Win *parent;

Область видимости в С++
В книге С++ Бархатный путь. ( http://khpi-iip.mipk.kharkiv.edu/library/extent/prog/cppvw/cpp_047.html) сказано, что область действия имен...

7
19495 / 10100 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
13.04.2019, 16:01
Цитата Сообщение от MINO Посмотреть сообщение
Почему переменная *d выводит числа 12345?
Потому что место переменной k еще никто не успел занять.

Попробуйте разные настройки оптимизации, или, например, поменять местами вывод *s и *d.
Также попробуйте другие компиляторы.

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

Добавлено через 2 минуты
Цитата Сообщение от MINO Посмотреть сообщение
должна удалятся
Да, и физически ничего не удаляется.
Просто с определенного момента память перестает считаться занятой и дальнейшее выполнение может как использовать этот участок сразу, так и нет. Тот период, когда вы видите нормальное значение - это следствие того, что дальнейший код еще не успел в своей работе задействовать этот участок под свои нужды.
0
12 / 12 / 5
Регистрация: 03.06.2016
Сообщений: 169
13.04.2019, 16:48  [ТС]
Я так понимаю что в момент вывода
[CPP]
std::cout << *d << std::endl;
[CPP]
переменная освобождается и результат может быть не предсказуемым, а у меня выводит 12345 потому что в память ничего не записалось.
Цитата Сообщение от DrOffset Посмотреть сообщение
Также попробуйте другие компиляторы.
В том то и дело что это поведение только в MSVC
0
19495 / 10100 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
13.04.2019, 16:58
Цитата Сообщение от MINO Посмотреть сообщение
В том то и дело что это поведение только в MSVC
Я вам про это и говорю. Если вы видите разное поведение на разных компиляторах - это повод задуматься о корректности кода.

Опять же, в рамках MSVС++ можно понаблюдать:
Поведение как у вас (почти): https://rextester.com/KQZM71893
Поменял местами *d и *s, теперь как будто бы указатель d, вместо s ведет себя "правильно": https://rextester.com/MHJ13355
Добавил ключ оптимизации O2: https://rextester.com/FWHKR73776
1
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
13.04.2019, 17:00
Цитата Сообщение от MINO Посмотреть сообщение
В том то и дело что это поведение только в MSVC
попробуйте запустить релиз версию
1
19495 / 10100 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
13.04.2019, 17:02
Лучший ответ Сообщение было отмечено MINO как решение

Решение

Цитата Сообщение от MINO Посмотреть сообщение
Я так понимаю что в момент вывода
C++
1
std::cout << *d << std::endl;
переменная освобождается и результат может быть не предсказуемым, а у меня выводит 12345 потому что в память ничего не записалось.
В момент вывода никакой переменной уже нет. Есть указатель, который указывает на то место, где она когда-то была.
Такой указатель считается невалидным, "висячим", и вы не имеете права использовать его для разыменования, потому что в этом случае эта операция приводит к неопределенному поведению. В общем-то на этом можно закончить разбираться в ситуации, т.к. остальные эффекты зависят, грубо говоря, от фазы Луны.
1
12 / 12 / 5
Регистрация: 03.06.2016
Сообщений: 169
13.04.2019, 17:47  [ТС]
Спасибо за пояснение. Я вабще зачем это все начал смотреть, после очередной лекции на курсах преподаватель рассказывал про умные компиляторы, и преподаватель заявил что код
C++
1
2
3
4
5
6
int *m()
{
    int k = 12345;
    s = &k;
    return &k;
}
компилирует переменную k в куче, типо программист не очень умный раз адрес локальной переменной в return кидает.
0
19495 / 10100 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
13.04.2019, 17:55
Цитата Сообщение от MINO Посмотреть сообщение
компилирует переменную k в куче
Нет, здесь переменная в стеке.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.04.2019, 17:55
Помогаю со студенческими работами здесь

Область видимости
Даю фрагмент программы: #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;cmath&gt; struct elem //тип элемента двусвязного списка ...

Область видимости
func { int someVariable; { int someVariable; //можно ли как нибудь получить доступ к переменной...

Область видимости файла
Мне не дает покоя вот такой вопрос: Проект состоит из нескольких файлов .cpp. Есть несколько .h файлов, содержащих определения...

Область видимости переменных
Здравствуйте. Столкнулся со следующей проблемой: есть файл main.cpp: int a, b; #include &quot;class.h&quot; int main() {...

Область видимости Protected
Еcть некий класс player и есть в нем переменная id в области паблик. Есть второй класс team который использует эту переменную. Пjка эти...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru