Technopedia Center
PMB University Brochure
Faculty of Engineering and Computer Science
S1 Informatics S1 Information Systems S1 Information Technology S1 Computer Engineering S1 Electrical Engineering S1 Civil Engineering

faculty of Economics and Business
S1 Management S1 Accountancy

Faculty of Letters and Educational Sciences
S1 English literature S1 English language education S1 Mathematics education S1 Sports Education
teknopedia

teknopedia

teknopedia

teknopedia

teknopedia
  • Registerasi
  • Brosur UTI
  • Kip Scholarship Information
  • Performance
  1. Weltenzyklopädie
  2. Stapelüberlauf – Wikipedia
Stapelüberlauf – Wikipedia
aus Wikipedia, der freien Enzyklopädie
(Weitergeleitet von Stack Overflow)
Stack Overflow ist eine Weiterleitung auf diesen Artikel. Zur Website mit diesem Namen siehe Stack Overflow (Website).

Ein Stapelüberlauf (englisch stack overflow) findet statt, wenn der Aufrufstapel eines Programms die Größe des dafür vorgesehenen Speicherbereichs überschreitet.[1]

Ein Stapelüberlauf verursacht üblicherweise den Absturz des Programms.

Ursachen

[Bearbeiten | Quelltext bearbeiten]

Rekursion

[Bearbeiten | Quelltext bearbeiten]

Da jeder Unterfunktionsaufruf durch einen Stack-Frame, der u. a. Funktionsargumente, lokale Variablen und die Rücksprungadresse enthält, repräsentiert wird, kann exzessive oder gar unendliche Rekursion den Aufrufstapel zum Überlaufen bringen.

Beispiel

[Bearbeiten | Quelltext bearbeiten]

Die folgende rekursive C-Funktion, die das i-te Element der Fibonacci-Folge zurückgibt, verursacht einen Stapelüberlauf, wenn i ausreichend groß ist.

long long fibonacci(int i) {
    if (i == 0) return 0;
    if (i == 1) return 1;
    return fibonacci(i-1) + fibonacci(i-2);
}

Große lokale Variablen

[Bearbeiten | Quelltext bearbeiten]

Da lokale Variablen üblicherweise im Aufrufstapel abgelegt werden, kann eine einzige übergroße lokale Variable einen Stapelüberlauf verursachen.

Beispiel

[Bearbeiten | Quelltext bearbeiten]

Das folgende C-Programm verwendet eine absurd große lokale Variable und kann somit einen Stapelüberlauf verursachen.

#include<stdio.h>

int main() {
    double daten[17179869184];
    printf("%f", daten[17179869183]);
    return 0;
}

Abhilfen

[Bearbeiten | Quelltext bearbeiten]

Rekursive Funktionen können immer in iterative umgewandelt werden, bei linear-rekursiven Funktionen (solche mit nur einem Rekursionsaufruf) und einigen weiteren einfachen Fällen geht das sogar formal.[2] Einer iterativen Funktion, die nötigenfalls auch den Laufzeitstack imitiert (indem z. B. eine Stack-Datenstruktur „von Hand“ gefüllt wird), steht der gesamte Speicherbereich des Systems zur Verfügung, der üblicherweise mehrere Größenordnungen großzügiger ausfällt. Den Vorgang, bei dem eine rekursive Funktion in eine iterative überführt wird, nennt man Entrekursivierung. Nachteilig ist der oft komplexere Code und die dadurch eben nötige manuelle Speicherverwaltung, sofern nicht eine Laufzeitumgebung mit automatischer Speicherverwaltung eingesetzt wird.

Einzelnachweise

[Bearbeiten | Quelltext bearbeiten]
  1. ↑ Robert Sheldon: What is stack overflow? Abgerufen am 27. August 2023 (englisch). 
  2. ↑ Peter Padawitz: Formale Methoden des Systemaufrufs. TU Dortmund, Dortmund 3. Februar 2021, S. 140 ff. (Volltext [PDF; abgerufen am 27. August 2023]). 
Abgerufen von „https://de.teknopedia.teknokrat.ac.id/w/index.php?title=Stapelüberlauf&oldid=236834649“
Kategorien:
  • Programmierung
  • Rekursion

  • indonesia
  • Polski
  • العربية
  • Deutsch
  • English
  • Español
  • Français
  • Italiano
  • مصرى
  • Nederlands
  • 日本語
  • Português
  • Sinugboanong Binisaya
  • Svenska
  • Українська
  • Tiếng Việt
  • Winaray
  • 中文
  • Русский
Sunting pranala
Pusat Layanan

UNIVERSITAS TEKNOKRAT INDONESIA | ASEAN's Best Private University
Jl. ZA. Pagar Alam No.9 -11, Labuhan Ratu, Kec. Kedaton, Kota Bandar Lampung, Lampung 35132
Phone: (0721) 702022
Email: pmb@teknokrat.ac.id