Frage

In GNU C ist das Ergebnis 13.Weil der statische Link verwendet wird.
Andernfalls wäre das Ergebnis bei Verwendung des dynamischen Links 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);
}

Am P-Punkt befindet sich der Aktivierungsdatensatz


z = 12


x = 4


y = 3


f und Zeiger auf Code f


g und Zeiger auf Code g


x = 1


h und Zeiger auf Code h


A


main und Zeiger auf den Code main


  1. Ist das richtig?
    Wenn Funktion g jedoch zurückkehrt, wie läuft es dann?
    Die Aktivierung für g und die Aktivierung für die Variable z werden gelöscht.
    Dann wird im Stapelrahmen nach dem Loch gesucht.

  2. Das Loch erscheint wirklich?

  3. Und gemäß dem Inline-Block in der Funktion h,
    Variable x ist der äußerste Block.(Dies bedeutet, dass die Funktion G 'Block im Block von Variable X verschachtelt ist.) Der nächste äußere Block ist Funktion G, nächste Funktion f ...Zeigt dann der statische Link der Funktion f auf den Frame-Zeiger der Funktion g?Oder der Frame-Zeiger der Funktion h?Was ist mit dem statischen Link der Funktion g?

War es hilfreich?

Lösung

Am Punkt p befinden sich 4 Aktivierungsdatensätze auf dem Stapel:


Aktivierungsdatensatz für g:

  • Rücksendeadresse an f
  • Statischer Link zum h-Aktivierungsdatensatz
  • z = 12

Aktivierungsdatensatz für f:

  • x = 4
  • Rücksendeadresse an h
  • Statischer Link zum h-Aktivierungsdatensatz
  • y = 3

Aktivierungsdatensatz für h:

  • x = 1
  • Absenderadresse an Hauptadresse

Aktivierungsdatensatz für Haupt:

  • a = nicht definiert
  • Rücksendeadresse an das Betriebssystem

Jeder Aktivierungsdatensatz für eine verschachtelte Funktion enthält einen Link zum lexikalisch umschließenden Aktivierungsdatensatz (hier in beiden Fällen h), der beim Aufruf der Funktion und beim Erstellen des Aktivierungsdatensatzes eingerichtet wird.An Punkt p wird der Code diesen Link dereferenzieren, um den Wert von x zu ermitteln, und das Durchsuchen solcher Links ist das EINZIGE Mal, dass eine Funktion jemals den Aktivierungsdatensatz einer anderen Funktion durchsucht.

Andere Tipps

Ich denke das an Punkt P, x kann nur auf die beziehen x definiert in h(); es konnte nur auf die beziehen x in g() Wenn es selbst im Inneren verschachtelt wäre g().

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top