Attivazione Record In GNU C (funzione annidata)
-
26-10-2019 - |
Domanda
In GNU C, il risultato è 13. Perché il link statico viene utilizzato.
In caso contrario, se si utilizza il collegamento dinamico, il risultato sarebbe 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);
}
Nel punto P, attivazione record è
z = 12
x = 4
y = 3
f e puntatore a codice f
ge puntatore al codice G
x = 1
he puntatore al codice h
a
principale e puntatore al codice principale
-
è vero?
Tuttavia, se la funzione g rendimenti, come sta andando?
L'attivazione per g e attivazione per z variabile viene cancellato.
Poi, nel frame dello stack, Il foro viene guardato. -
Il foro appare davvero?
-
E secondo blocco in linea, in funzione h,
variabile x è il blocco più esterno. (Ciò significa che blocco funzione g' è annidata nel blocco di variabile x) successivo blocco esterno è funzione g, funzione successiva f ... Poi, Do la funzione di f statico punto di collegamento per la funzione puntatore riquadro di g? O a forma di cornice la funzione di h? Che dire di collegamento statico funzione di g?
Soluzione
Al punto p, ci sono 4 record di attivazione dello stack:
record di attivazione per g:
- indirizzo di ritorno di f
- collegamento statico per registrare h di attivazione
- z =
12
record di attivazione per f:
- x =
4
- indirizzo di ritorno a h
- collegamento statico per registrare h di attivazione
- y =
3
record di attivazione per h:
- x =
1
- indirizzo di ritorno al principale
record di attivazione per il main:
- a = non definita ??em>
- indirizzo di ritorno al OS
Ogni record di attivazione per una funzione nidificata contiene un collegamento alla documentazione di attivazione lessicale racchiudendo (h in entrambi i casi qui) che è impostato quando viene chiamata la funzione e viene creato il record di attivazione. Al punto p, il codice sarà dereference che puntano a trovare il valore di x, e guardando attraverso tali collegamenti è il momento solo una funzione potrà mai guardare record di attivazione di qualche altra funzione.
Altri suggerimenti
Credo che al punto P, x
può fare riferimento solo alla x
definito h()
; potrebbe riferisce soltanto alla x
in g()
qualora sia esso stesso nidificata g()
all'interno.