2014-06-06 10 views
5
#include <stdio.h> 
int main(void) 
{ 
    int (*fp)(void); 
    printf("Loopy.\n"); 
    fp = &main; //point to main function 
    fp(); //call 'main' 

    return 0; 
} 

Anstatt die Schleife endlos auszuführen, wird die "Schleife" für ca. 10-20 Sekunden auf meinem Computer ausgeführt und dann der standardmäßige Windows-App-Absturzbericht angezeigt. Warum ist das?Funktion Pointer - Warum stürzt dieser Code ab?

Compiler: GCC IDE: Code :: Blocks OS: Win7 64bit

enter image description here

+0

[Working abstürzen, nachdem kann gut zu mir] (http://ideone.com/Qzcc3Q). Kann nicht reproduzieren. – haccks

+4

Der Ausnahmecode '0xc00000fd' ist ein Stapelüberlauf. Was hast du erwartet? –

+0

@AustinBrunkhorst Ich erwartete eine Endlosschleife, ich experimentierte. Auch, wie die überwiegende Mehrheit der Leute habe ich nicht die Crash-Details gelesen :). –

Antwort

8

10..20 Sekunden ist ungefähr so ​​lange, wie es Ihren Computer nimmt den Stapel überläuft.

Ein neuer Stapelrahmen wird jedes Mal erstellt, wenn sich Ihre Funktion rekursiv über einen Funktionszeiger aufruft. Da der Aufruf indirekt erfolgt, erhält der Compiler keine Chance, den Tail-Call zu einer Schleife zu optimieren, so dass Ihr Programm schließlich mit dem Stack-Überlauf abstürzt.

Wenn Sie Ihr Programm so einstellen, dass es nach einer festgelegten Anzahl von Wiederholungen anhält, sagen Sie, indem Sie einen Zähler einrichten, würde Ihr Programm korrekt bis zum Ende laufen (demo).

#include <stdio.h> 

int counter = 200; 

int main(void) 
{ 
    int (*fp)(void); 
    printf("Loopy %d\n", counter); 
    fp = &main; //point to main function 
    if (counter--) { 
     fp(); //call 'main' 
    } 
    return 0; 
} 
+0

Fantastische Antwort, wurde kürzlich über Stack-Frames unterrichtet, ich hätte es gesehen! Vielen Dank. –

1

Das Verhalten wird Compiler abhängig es ohne keine Antwort Stack-Überlauf oder einfach nur dort hängen, aber der einzige Grund kann drängen zu viele Stack-Frames in dem Speicherstapel

Verwandte Themen