2011-06-11 8 views
5

En GNU C, el resultado es 13. Debido a que se utiliza el enlace estático.
lo contrario, si se utiliza el enlace dinámico, el resultado sería 16.Registro de activación en GNU C (función anidada)

#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, Activación de registros es


z = 12


x = 4


y = 3


f y puntero a código F


g y puntero a código g


x = 1


h y puntero al código h


un


principal y puntero al código principal


  1. ¿Es eso cierto?
    Sin embargo, si la función g vuelve, ¿cómo va?
    Se eliminan la activación de gy la activación de la variable z.
    Luego en el marco de la pila, se mira el orificio.

  2. ¿Realmente aparece el orificio?

  3. Y De acuerdo con el bloque En línea, En la función h,
    variable x es el bloque más externo. (Significa que el bloque de la función g 'está anidado en el bloque de la variable x) el siguiente bloque externo es la función g, la siguiente función f ... Luego, ¿Funciona el punto de enlace estático f con el puntero de marco 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?

+0

+1 para el concepto. ¡GUAUU! He estado escribiendo el código C desde hace años. Nunca se supo que las funciones anidadas eran posibles. Solo pensé que Pascal y Modula lo tenían. Ignoradme - sonríe ... – itsols

+5

@itsols: Las funciones anidadas no son compatibles con C. Son una extensión de GCC, y notablemente una que funciona en código C pero no en C++. Para una exploración de si son una buena idea, consulte: http://stackoverflow.com/questions/2929281/are-nested-functions-a-bad-thing-in-gcc –

+0

Y NO SON CIERRES. Cuando se devuelve una función que define una función anidada, cualquier puntero a las funciones que define se invalida. Esto limita drásticamente su utilidad. Además, ¡no están implementados en todas las arquitecturas! –

Respuesta

2

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


de activación para g:

  • dirección de retorno a f
  • enlace estático para registro de activación h
  • z = 12

registro de activación para f:

  • x = 4
  • dirección de retorno a h
  • enlace estático para registro de activación h
  • y = 3

activación registro para h:

  • x = 1
  • dirección de retorno al principal

registro de activación para las principales:

  • una dirección definida
  • retorno = a OS

Cada registro de activación para una función anidada contiene un enlace al registro de activación léxica que encierra (h en ambos casos aquí) que se configura cuando la función se llama y se crea el registro de activación. En el punto p, el código desreferenciará ese enlace para encontrar el valor de x, y mirar a través de dichos enlaces es el ÚNICO momento en que una función alguna vez verá el registro de activación de otra función.

0

creo que en el punto P, x sólo puede referirse a la x se define en h(); solo podría referirse al x en g() si estuviera anidado dentro de g().

Cuestiones relacionadas