Pregunta

En Gnu C, el resultado es 13. Debido a que se usa el enlace estático.
De lo contrario, si se usa el enlace dinámico, el resultado sería 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);
}

En el punto P, el registro de activación es


z = 12


x = 4


y = 3


f y puntero al código F


g y puntero al código G


x = 1


H y puntero al código H


a


principal y puntero al código principal


  1. ¿Está bien?
    Sin embargo, si la función G regresa, ¿cómo va?
    La activación para G y la activación para la variable Z se elimina.
    Luego, en el marco de la pila, se mira el agujero.

  2. ¿El agujero realmente aparece?

  3. Y según el bloque en línea, en la función h,
    La variable x es el bloque más externo. (Significa que el bloque de la función G 'está anidada en el bloque de X de la variable) El siguiente bloque exterior es la función G, la siguiente función F ... ¿entonces, ¿el punto de enlace estático de la función F punto a la función del puntero de cuadro de la función G? O el puntero de marco de la función H? ¿Qué pasa con el enlace estático de la función G?

¿Fue útil?

Solución

En el punto P, hay 4 registros de activación en la pila:


Registro de activación para G:

  • Dirección de devolución a F
  • Enlace estático al registro de activación H
  • z = 12

Registro de activación para F:

  • x = 4
  • Dirección de devolución a H
  • Enlace estático al registro de activación H
  • y = 3

Registro de activación para H:

  • x = 1
  • Dirección de devolución a Main

Registro de activación para Main:

  • a = indefinido
  • Dirección de devolución al sistema operativo

Cada registro de activación para una función anidada contiene un enlace al registro de activación de encierra léxicamente (h en ambos casos aquí) que se configura cuando se llama la función y se crea el registro de activación. En el punto P, el código desertorizará ese enlace para encontrar el valor de X, y mirar a través de tales enlaces es el único momento en que una función verá el registro de activación de otra función.

Otros consejos

Creo que en el punto P, x solo puede referirse al x definido en h(); solo podría referirse al x en g() Si se anidara por dentro g().

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top