Запись активации в GNU C (вложенная функция) - PullRequest
5 голосов
/ 11 июня 2011

В 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 и указатель на код main


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

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

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

Ответы [ 2 ]

2 голосов
/ 12 июня 2011

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


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

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

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

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

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

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

запись активации для основной:

  • a = undefined
  • адрес возврата в ОС

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

0 голосов
/ 12 июня 2011

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

...