Question

Dans GNU C, le résultat est 13. Parce que le lien statique est utilisé.
Dans le cas contraire, si le lien dynamique est utilisé, le résultat serait 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);
}

Au point P, l'activation enregistrement est


z = 12


x = 4


y = 3


f et f pointeur vers le code


g et un pointeur de code à g


x = 1


h et pointeur vers le code h



principal et pointeur principal de code


  1. est-ce pas?
    Toutefois, si les rendements fonction g, comment ça va?
    L'activation de g et d'activation pour z variable est supprimée.
    Ensuite, dans un cadre de pile, le trou est recherché.

  2. Le trou semble vraiment?

  3. Selon bloc en ligne, en fonction h,
    variable x est le plus bloc externe. (Cela signifie que le bloc fonction g » est imbriqué dans le bloc de variables x) prochain bloc externe est fonction g, fonction suivante f ... Ensuite, lien statique de Do fonction f point au pointeur de la trame de la fonction g? Ou la fonction de pointeur de trame de h? Qu'en est-il de lien statique de la fonction g?

Était-ce utile?

La solution

au point P, il y a 4 fiches d'activation sur la pile:


enregistrement d'activation pour g:

  • adresse de retour à f
  • lien statique enregistrement d'activation h
  • z = 12

enregistrement d'activation pour f:

  • x = 4
  • adresse de retour h
  • lien statique enregistrement d'activation h
  • = y 3

enregistrement d'activation h:

  • x = 1
  • adresse de retour au menu principal

enregistrement d'activation pour principal:

  • a = non défini
  • adresse de retour OS

Chaque enregistrement d'activation d'une fonction imbriquée contient un lien vers l'enregistrement d'activation renfermant lexicalement (h dans les deux cas ici) qui est mis en place lorsque la fonction est appelée et l'enregistrement d'activation est créé. Au point p, le code déréférence ce lien pour trouver la valeur de x, et en regardant à travers ces liens est le seul moment une fonction jamais regarder le dossier d'activation de toute autre fonction.

Autres conseils

Je pense que au point P, x ne peut se référer à la x définie dans h(); il ne pouvait se référer à la x en g() si elle était elle-même imbriqué dans g().

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top