Was isn Stackoverflow?

...komplette Frage anzeigen

7 Antworten

Dafür muss man etwas über den Speicher, klein wenig das Rechenwerk und natürlich etwas vom Programmieren verstehen.

Programme werden so programmiert, dass einzelde "Abschnitte" in Methoden/Funktionen gelagert sind.

Also etwas, was man an mehreren stellen öfers braucht. Manchmal ist es auch sinnvoll sich rekursive Funktionen zu basteln. Das sind Methoden, die sich selbst aufrufen. Sowas macht zum Beispiel bei einer Fakultät einen Sinn:

Fakultät(4) = 24
Fakultät(3) = 6
Fakultät(2) = 2
Fakultät(1) = 1

Und so kann man es auch programmieren. Man Ruft nur Fakultät(4) auf und in der methode steht, dass er die 4 mit Fakultät(4-1) multiplizieren soll und zurückgeben soll.

Aber was passiert beim Aufruf einer Methode? Und jetzt wird es komplizierter. Jeder Methodenaufruf übermittelt erst alle übergebenden Parameter (in unserem Falle die 4) in den Kellerspeicher (auch genannt: Stack). Dieser Vorgang nennt man PUSH. Der Kellerspeicher ist ein Speicher, der (logisch) "rückwärts" im Speicher von unten nach oben läuft.

Nachdem die 4 im Kellerspeicher abgelegt wurde, wird die "Untermethode" aufgerufen. Das nennt man CALL. Beim CALL wird die Rücksprungadresse auch in einen seperaten Teil des Stacks abgelegt.

In dem Unterprogramm wird dann mittels POP alle Parameter wieder aus dem Stack geholt (in umgekehrter Reihenfolge (nennt man FILO (First In Last out) - Prinzip))

Jetzt sind wir also in dem Unterprogramm (Methode) und es werden alle nötigen Berechnungen (mit der 4) dafür gemacht. Wenn man fertig ist, dann wird (optional) ein Rückgabewert mittels PUSH in den Stack gelegt und es wird RET(urn) aufgerufen. Dabei holt man die letzte Rücksprungadresse aus dem Kellerspeicher und kehrt dahin wieder zurück. Mittels POP hat man dann den Rückgabewert der Methode.

Jetzt wirds Megakompliziert ^^: Wir haben ja eine rekursive Methode. Das heißt, dass in Fak4 Fak3 aufgerufen wird und in Fak3 Fak2.

Auf Maschinenebe sieht das also in etwa so aus:

PUSH 4
CALL Fak
POP ; 4 aus Stack
PUSH 3
CALL Fak
POP ; 3 aus Stack
PUSH 2
CALL Fak
POP
PUSH 1
CALL Fak
POP

PUSH 1
RET ; Rücksprung zu Fak2
POP
PUSH 2
RET
POP
PUSH 6
RET
POP
PUSH 24
RET ; Rücksprung zum Ursprung
POP ; 24 aus dem Stack holen

soviel zur Theorie. :-)

Jetzt nehmen wir mal an, dass der Programmierer einen Fehler gemacht hat und in der Methode Fakultät sich selbst nicht mit Fakultät(x-1) aufruft, sondern mit Fakultät(x). Dann würde man die Methode immer und immer und immer wieder mit ein und der gleichen Zahl aufrufen. Sie würde in 30 Trilliarden Jahren nicht die 1 erreichen. Das wäre dann also eine rekursive Endlosschleife.

Normale Endlosschleifen enden darin, dass sich das programm einfach festfährt und hängt. Wenn aber dabei der Stack belastet wird (also bei Rekursivmethoden), dann füllt man sich damit den Stack auf. Und irgendwann sagt der Rechner "bis hier her und nicht weiter". Dann ist der "Keller" nämlich vollgelaufen. Und auf Englisch halt: Stack Overflow.

Dahinter steckt so einiges an Theorie, die man wissen sollte. Das ist auch in 5min nicht so leicht erklärbar.

Ich hoffe dennoch, dass ich dir helfen konnte.

Gruß
Omni

PS: kann auch sein, dass du das Forum meinst. Falls ja, dann habe ich jetzt zu viel erzählt und du musst das wieder vergessen ^^

Umständlicher gehts nicht, was ?

0
@heizfeld

Es tut mir herzlich leid, dass ich nicht der Typ bin, der einfach sagt "schau mal bei Wikiblödia".

Es tut mir aufrichtig leid, dass ich Fragen nach bestem Gewissen beantworten will.

0

Ein Computerfehler der auftaucht wenn Daten in einem Stapel gespeichert werden und die maximale Größe des Stapels überschritten wird. Viele Exploits basieren darauf, dass man eine  Stapelüberlauf (stack overflow) erzeugt. 

Und.. ein beliebtes Programmierforum.

Das ist das bekannteste Forum über Programmierung. Deswegen empfehle ich auch immer auf Englisch zu googlen, weil man dann die brauchbarsten Ergebnisse erhält.

Wenn du programmieren kannst und jemals auf Englisch gegoogelt hättest, wärst du dort früher oder später gelandet.

Ein englischsprachiges Forum in dem man Fragen zum Programmieren stellen kann.

Wenn einer ganz viel Bier trinkt und es oben wieder raus kommt, ist das ein Stackoverflow. Es ist einfach alles gefüllt und passt nix mehr rein. Nicht einmal eine leckere Pizza...

Programmierer Community

Was möchtest Du wissen?