Запись активации в GNU C (вложенная функция)
В 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("%dn", a);
}
В точке P запись активации равна
Z = 12
X = 4
Y = 3
F и указатель на код f
G и указатель на код g
X = 1
H и указатель на код h
A
Main и указатель на код main
-
Это правда?
Однако, если функция g возвращает, как это происходит?
Активация для g и активация для переменной z удаляются.
Затем в рамке стека просматривается отверстие. -
Дыра действительно появилась?
-
И согласно встроенному блоку, в функции h,
переменная x является самым внешним блоком. (Это означает, что блок функции g' вложен в блок переменной x) следующий внешний блок-это функция g, следующая функция f... тогда делать статическая ссылка функции f на указатель фрейма функции g? Или указатель фрейма функции h? А как насчет статической связи функции g?
2 ответа:
В точке p имеется 4 записи активации в стеке:
Запись активации для g:
- обратный адрес к f
- статическая ссылка на запись активации h
- z =
12
Запись активации для f:
- x =
4
- обратный адрес в h
- статическая ссылка на запись активации h
- y =
3
Запись активации для h:
- x =
1
- обратный адрес к главному
Запись активации для main:
- a = неопределенный
- обратный адрес в ОС
Каждая запись активации для вложенной функции содержит ссылку на лексически заключенную запись активации (h в обоих случаях здесь), которая устанавливается при вызове функции и создании записи активации. В точке p код разыменует эту ссылку, чтобы найти значение x, и просмотр таких ссылок является единственным временем a функция всегда будет смотреть на запись активации какой-то другой функции.