3 Stimmen

Was passiert mit Stack Frames, wenn main() main() aufruft?

Bitte beachten Sie den folgenden Code:

#include <stdio.h>

int main()
{
    static int counter=5;

    printf ("Counter = %d\n", counter);

    if (counter--)
    {
        main();
    }

    return 0;
}

Kompilieren:

gcc test.c -ansi -Wall –pedantic

Ausführen:

[root@mars home]# ./a.out 
Counter = 5
Counter = 4
Counter = 3
Counter = 2
Counter = 1
Counter = 0

Hier ruft main() sich selbst() auf.

Es scheint, dass main() Der ursprüngliche Stackframe der Funktion wird jedes Mal überschrieben, wenn main() von selbst aufgerufen wird.

Aber wie lautet die Absenderadresse? Kann eine Funktion zu ihrem eigenen Stackframe zurückkehren?

Bitte helfen Sie mir, diesen Zweifel zu klären.

Gracias.

6voto

sirgeorge Punkte 6153

Nein wird sie nicht überschrieben. Es handelt sich um einen normalen Funktionsaufruf (in diesem Fall rekursiv). Sie sind wahrscheinlich verwirrt durch Ihre counter variabel. Diese Variable wird wie folgt deklariert statisch was bedeutet, dass es sich um nur einmal initialisiert so dass die folgende Zeile nur einmal "ausgeführt" wird:

static int counter=5;

Mit anderen Worten: Sie können sich Ihre counter als wäre es eine globale Variable, die nur einmal initialisiert wurde (mit dem Wert 5). Bei jedem Aufruf von main wird er dekrementiert, bis er Null erreicht. Nachdem dies geschehen ist, werden alle main Funktionen zurückkehren, ist der Stapel also unwinded (wie bei einem normalen Funktionsaufruf, der es ist).

3voto

Ian Goldby Punkte 4744

Dies ist in vielen Computersprachen ganz normal und wird als "Rekursion" bezeichnet. Für jeden Aufruf der Funktion wird ein neuer Stackframe erstellt, so dass kein Überschreiben stattfindet.

Die Rücksprungadresse der äußeren main() ist wie üblich die Laufzeitbibliothek. Die Rücksprungadresse des inneren main() ist das äußere main().

Das Einzige, was die Sache in Ihrem Beispiel verwirrt, ist, dass Sie den Zähler als statisch deklariert haben. Das bedeutet, dass er zugewiesen wird auf dem Haufen im Datensegment und nicht auf dem Stack (wie von alk im Kommentar erklärt), so dass jeder Aufruf von main() die gleiche Instanz von counter verwendet.

1voto

anishsane Punkte 18999

Kurze Antwort: Es ist ein einfacher Fall von Rekursion. Es werden also neue Stack-Frames zugewiesen und vorherige Frames nicht überschrieben.

Lange Antwort:
Was passiert mit Stack Frames, wenn main() ruft auf. main() :
C unterscheidet main nicht von einer anderen Funktion. Es ist ein einfacher, normaler Fall von Rekursion. main" ist NUR deshalb etwas Besonderes, weil die standardmäßige crt0.asm, die mit dem Compiler geliefert wurde (oder wie auch immer sie in Ihrem Compiler heißt), main aufruft, nachdem die Grundinitialisierung (wie z.B. der Stack-Zeiger) abgeschlossen ist.
Abgesehen von diesem Unterschied gibt es nichts, was an Main besonders ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X