Вопрос

В 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);
}

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


z = 12


x = 4


y = 3


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


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


x = 1


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


а


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


  1. Это правильно?
    Однако, если функция G возвращает, как дела?
    Активация для G и активация для переменной Z удаляется.
    Затем в рамке стека отверстие выглядит.

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

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

Это было полезно?

Решение

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


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

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

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

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

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

  • x = 1
  • возвратный адрес в Main

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

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

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top