Запись активации в 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


  1. Это правда?
    Однако, если функция g возвращает, как это происходит?
    Активация для g и активация для переменной z удаляются.
    Затем в рамке стека просматривается отверстие.

  2. Дыра действительно появилась?

  3. И согласно встроенному блоку, в функции h,
    переменная x является самым внешним блоком. (Это означает, что блок функции g' вложен в блок переменной x) следующий внешний блок-это функция g, следующая функция f... тогда делать статическая ссылка функции f на указатель фрейма функции g? Или указатель фрейма функции h? А как насчет статической связи функции g?

2 5

2 ответа:

В точке p имеется 4 записи активации в стеке:


Запись активации для g:

  • обратный адрес к f
  • статическая ссылка на запись активации h
  • z = 12

Запись активации для f:

  • x = 4
  • обратный адрес в h
  • статическая ссылка на запись активации h
  • y = 3

Запись активации для h:

  • x = 1
  • обратный адрес к главному

Запись активации для main:

  • a = неопределенный
  • обратный адрес в ОС

Каждая запись активации для вложенной функции содержит ссылку на лексически заключенную запись активации (h в обоих случаях здесь), которая устанавливается при вызове функции и создании записи активации. В точке p код разыменует эту ссылку, чтобы найти значение x, и просмотр таких ссылок является единственным временем a функция всегда будет смотреть на запись активации какой-то другой функции.

Я думаю, что в точке P x может ссылаться только на x, определенный в h(); он мог бы ссылаться только на x в g(), Если бы сам был вложен в g().