Запись активации в GNU C (вложенная функция)
-
26-10-2019 - |
Вопрос
В GNU C результат составляет 13. Поскольку используется статическая связь.
В противном случае, если используется динамическая ссылка, результат будет 16.
#include <stdio.h>
int h(){
int x = 1;
int g(int z){
return z + x; <------------------ P
}
int f(int y){
int x = y + 1;
return g(x * y);
}
return f(3);
}
int main(){
int a = h();
printf("%d\n", a);
}
В точке р, запись активации
z = 12
x = 4
y = 3
F и указатель на код F
G и указатель на код G
x = 1
H и указатель на код H
а
Основной и указатель на код Main
Это правильно?
Однако, если функция G возвращает, как дела?
Активация для G и активация для переменной Z удаляется.
Затем в рамке стека отверстие выглядит.Действительно появляется дыра?
И в соответствии с встроенным блоком, в функции h,
Переменная x - самый внешний блок. (Это означает, что функция G 'блок вложена в блок переменной x). Следующая внешняя блока - функция g, следующая функция f ... тогда, сделайте точку статической ссылки функции F, чтобы функционировать по указателю кадры F -функции? Или указатель кадры функции H? Как насчет статической ссылки функции G?
Решение
В точке P есть 4 записи активации в стеке:
Запись активации для G:
- возвратный адрес на f
- Статическая ссылка на запись активации H
- z =
12
Запись активации для F:
- x =
4
- возвратный адрес на h
- Статическая ссылка на запись активации H
- y =
3
Запись активации для H:
- x =
1
- возвратный адрес в Main
Запись активации для Main:
- a = неопределенный
- возвратный адрес в ОС
Каждая запись активации для вложенной функции содержит ссылку на лексическую записи активации (H в обоих случаях здесь), которая настраивается при вызываемой функции и создается запись активации. В точке P код будет определять, что ссылка на поиск значения x, и просмотр таких ссылок - единственный раз, когда функция когда -либо будет смотреть на запись активации какой -то другой функции.
Другие советы
Я думаю, что в точке П, x
может ссылаться только на x
определено в h()
; это может относиться только к x
в g()
Если бы он был вложенным внутри g()
.