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


  1. è 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.

  2. Il foro appare davvero?

  3. 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?

È stato utile?

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
  • 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top