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

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

13.04.2019, 15:44. Показов 1320. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru