Переменная блочного кода, видимость снаружи без её уничтожения

В качестве примера возьмём следующий код:

int x=0;
{ // блочный код
 int y=0;
}

Допустим, что мы завершили выполнение блочного кода и вышли наружу. Но представим, что блочный код всё также остаётся существовать, а вместе с ним и переменная 'y'. И теперь если мы попытаемся использовать переменную 'y' снаружи, что произойдёт? Предусмотрен ли какой-то запрет на попытку использовать снаружи переменные, заключенные внутри блочного код?

Изначально это не удаётся сделать потому, что пока мы снаружи и до блочного кода, то переменная внутри него бывает ещё не объявлена, а когда мы снаружи и уже после блочного кода, то к этому моменту она бывает уничтожена. Поэтому и попросил представить ситуацию где блочный код продолжает существовать, когда мы вышли из него.


Ответы (1 шт):

Автор решения: αλεχολυτ

Автоматические переменные создаются на стеке. По выходу из блока указатель стека возвращается к значению, которое было до входа в блок, а переменные, объявленные в блоке, перестают быть доступны. Технически можно сохранить указатель на переменную внутри блока и использовать его после завершения блока:

int* py = NULL;
{
   int y = 42;
   py = &y;
}
// use *py

Но такое использование приводит к неопределённому поведению и потенциально неожиданным результатам.

#include <stdio.h>

int main() {
    int* py = NULL;
    {
        int y = 42;
        py = &y;
    } 

    printf("%d\n", *py);  // 42 или нет?
}

Например, без оптимизации имеем старое значение. А с оптимизацией уже видим 0.

Если нужно далее по коду обеспечить доступ к какой-то переменной, то следует или вовсе избавиться от блока, или копировать данные во внешнюю к блоку переменную, или использовать динамическое выделение памяти (см. malloc).

→ Ссылка