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

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

13.04.2019, 15:44. Показов 1315. Ответов 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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
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
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru