Переменная блочного кода, видимость снаружи без её уничтожения
В качестве примера возьмём следующий код:
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).