Запись активации в 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("%d\n", a);
}

В точке P запись активации


z = 12


x = 4


y = 3


f и указатель на код f


g и указатель на код g


x = 1


h и указатель на код h


a


main и указатель на основной код


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

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

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


person KayKay    schedule 11.06.2011    source источник
comment
+1 за концепцию. ВОТ ЭТО ДА! Я пишу код C уже целую вечность. Никогда не знал, что вложенные функции возможны. Я только думал, что он есть у Паскаля и Модулы. Незнайка меня - улыбается...   -  person itsols    schedule 11.06.2011
comment
@itsols: вложенные функции не поддерживаются C. Они являются расширением GCC, и в частности тем, которое работает в коде C, но не в C++. Чтобы узнать, являются ли они хорошей идеей, см.: stackoverflow.com/questions/2929281/   -  person John Zwinck    schedule 11.06.2011
comment
И это НЕ ЗАКРЫТИЯ. Когда функция, определяющая вложенную функцию, возвращает значение, любые указатели на определяемые ею функции становятся недействительными. Это резко ограничивает их полезность. Кроме того, они реализованы не на всех архитектурах!   -  person David Given    schedule 11.06.2011


Ответы (2)


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


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

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

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

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

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

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

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

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

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

person Chris Dodd    schedule 12.06.2011

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

person Jonathan Leffler    schedule 12.06.2011