Переменная области действия блока и запись активации
Я понимаю, что локальные переменные (наряду с другими вещами) помещаются в запись активации. И запись активации должна существовать до того, как функция начнет выполняться. Рассмотрим функцию ниже:
void f(void)
{
int i;
scanf("%d", &i);
if (i > 10) {
int j = 22;
// do some operations on j here.
}
// more code below...
}
Глядя на эту функцию, кажется, что переменная j
может существовать или не существовать в зависимости полностью от ввода пользователя во время выполнения. В этом случае,
- Будет ли переменная
j
быть помещены в запись активации? - Определена ли эта реализация (другими словами, будет ли какой-то компилятор генерировать код, эквивалентный
j
быть объявленным снаружи и над блоком if`)? - Или будет
j
быть просто размещены в сегменте стека во время выполнения, если это будет необходимо? Но, в таком случае, как будетj
выйти из области видимости послеif
блок?
Я не смог найти много информации об этом в спецификации C11. Заранее спасибо.
1 ответ
Активация записи также называется стековым фреймом, если я не ошибаюсь. Я считаю, что это ответы:
Q1. Будет ли переменная j помещена в запись активации?
A1: Да, если не оптимизировано компилятором.
Q2. Определена ли эта реализация (другими словами, будет ли какой-то компилятор генерировать код, эквивалентный объявлению j вне и выше блока if`)?
A2: Это определяется реализацией. Зависит от компилятора и настроек компилятора, но в большинстве случаев j будет в записи активации.
Q3. Или просто разместит j в сегменте стека во время выполнения, если это будет необходимо? Но в таком случае как j выйдет из области видимости после блока if?
A3: Нет, распределение в C обычно не зависит от содержимого локальной переменной.