Diese einfache C-Programm beendet wird selten in der gleichen Aufruftiefe:Warum sind Stackoverflow-Fehler chaotisch?
#include <stdio.h>
#include <stdlib.h>
void recursive(unsigned int rec);
int main(void)
{
recursive(1);
return 0;
}
void recursive(unsigned int rec) {
printf("%u\n", rec);
recursive(rec + 1);
}
Was sind die Gründe für diese chaotische Verhalten sein könnte?
Ich benutze Fedora (16GiB Ram, Stackgröße von 8192) und kompiliert mit CC ohne Optionen.
EDIT
- Ich bin mir bewusst, dass dieses Programm einen Stackoverflow werfen
- Ich weiß, dass einige Compiler-Optimierungen ermöglicht, das Verhalten ändern und dass das Programm Integer-Überlauf erreichen.
- Ich bin mir bewusst, dass dies ein undefiniertes Verhalten ist, der Zweck dieser Frage ist es, einen Überblick über die Implementierung spezifischen internen Verhaltensweisen zu verstehen, die erklären könnten, was wir dort beobachten.
Die Frage ist mehr, da unter Linux der Thread-Stapelgröße festgelegt ist und gegeben durch ulimit -s
, was die zur Verfügung stehenden Stapelgröße beeinflussen würde, so dass der Stackoverflow nicht immer bei der gleichen Aufruftiefe auftreten?
EDIT 2 @BlueMoon sieht immer die gleiche Leistung auf seinem CentOS, während auf meiner Fedora, mit einem Stapel von 8 M, I verschiedene Ausgängen (zuletzt gedruckten integer 261.892 oder 261.845 zu sehen, oder 261.826 oder ...)
@moffeltje 1 2 3 4 5 ... unendlich –
Es gibt keine Stoppbedingung: schließlich rec + 1 – Coconop
Überlauf wird der Titel @moffeltje zu lesen: ** Warum sind chaotisch ** Fehler Stackoverflow –