Запись активации в 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 функция всегда будет смотреть на запись активации какой-то другой функции.