В 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);
}
В точке P запись активации
z = 12
x = 4
y = 3
f и указатель на код f
g и указатель на код g
x = 1
h и указатель на код h
a
main и указатель на основной код
Верно ли это?
Однако, если функция g возвращается, как дела?
Активация для g и активация для переменной z удаляются.
Затем во фрейме стека просматривается дыра.Дырка действительно появляется?
И Согласно встроенному блоку, в функции h
переменная x является самым внешним блоком. (Это означает, что блок функции g' вложен в блок переменной x) следующий внешний блок - это функция g, следующая функция f... Тогда, указывает ли статическая ссылка функции f на указатель кадра функции g? Или указатель кадра функции h? Как насчет статической ссылки функции g?