Почему неверный код работает без ошибок?

150
13 февраля 2022, 16:30

Почему приведенный код работает у меня без ошибок?

int* func() {
   int var = 100;
   return &var;
}

int main()
{
    int* ptr = func();
    cout << *ptr; // печатает 100, хотя здесь я ждал ошибки или неопределённого поведения, ведь var должна быть уже удалена к этому моменту
}

Я возвращаю адрес на локальную переменную var, которая должна была удалиться при выходе из func(), но я всё равно могу обратиться к ней (cout << *ptr;)

Answer 1

Общий принцип -

Если вы переходите дорогу в неположенном месте, то это еще не значит, что вас обязательно должна сбить машина. А если не сбила - то это еще не значит, что можно переходить дорогу в неположенном месте...

#include <iostream>
using namespace std;
int* func()
{
   int var = 100;
   return &var;
}
int z()
{
    int u[5] = { };
    return u[3];
}
int main()
{
    int* ptr = func();
    cout << *ptr << endl;
    cout << z() << endl;
    cout << *ptr << endl;
}

Компилируем VC+2017 с ключиком /Od, и получаем на выходе

100
0
1677336624

Просто у вас стек портится не мгновенно :)...

Answer 2

Напечатать 100 - это один из множества вариантов неопределенного поведения.

Неопределенное поведение не тождественно ошибке.

Может быть ошибка, может быть то, что вы ожидали, а может и еще что-нибудь

READ ALSO
Конфликт двух классов в разных пространствах имён C++

Конфликт двух классов в разных пространствах имён C++

Есть два класса с одинаковыми именами, которые находятся в разных файлах ( но с одинаковыми названиями ) в разных папкахКлассы обёрнуты в разные...

149
синтаксис в шаблонном классе

синтаксис в шаблонном классе

у нас есть только шаблон Vector<T> те

121
thread.join() Почему потоки вызываются в случайном порядке? С++

thread.join() Почему потоки вызываются в случайном порядке? С++

Пытаюсь разобраться в многопоточности и mutexПо задумке сначала должен выполниться thread Calc(Stream), после его окончания должен выполниться thread...

163