ProgrammierungC-Entwickler

Erklären Sie den Unterschied zwischen Stack und Heap in C und wann man welchen Speichertyp verwenden sollte?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort.

In C kann der Speicher für Variablen entweder im Stack oder im Heap zugewiesen werden.

  • Stack — reserviert den Speicher automatisch beim Betreten der Funktion und gibt ihn beim Verlassen frei. Schnell, aber der Speicherumfang ist durch die Größe des Stacks (in der Regel einige MB) begrenzt.
  • Heap — weist Speicher dynamisch über malloc, calloc, realloc zu und muss manuell über free freigegeben werden. Der Speicherumfang wird von den Möglichkeiten des Systems bestimmt, der Zugriff ist jedoch langsamer und die Freigabe muss manuell kontrolliert werden.

Wann den Stack verwenden:

  • Für lokale Variablen, wenn ihre Größe klein und zur Compilerzeit bekannt ist.
  • Für Funktionsargumente und kleine Arrays.

Wann den Heap verwenden:

  • Wenn die Speichergröße im Voraus unbekannt ist.
  • Für große oder langlebige Objekte.

Beispielcode:

// Im Stack int arr[10]; // Im Heap int* parr = malloc(sizeof(int) * 10); // Vergessen Sie nicht, den Speicher freizugeben free(parr);

Fangfrage.

Frage: Was passiert, wenn für ein Array, das über malloc zugewiesen wurde, die Funktion free nicht aufgerufen wird?

Antwort: Es tritt ein Speicherverlust (memory leak) auf. Dynamisch zugewiesener Speicher wird nicht automatisch freigegeben, und im Laufe der Zeit kann dies zu einem erschöpften Speicher des Programms oder des gesamten Systems führen.

Beispielcode:

void leak() { int* leakArr = malloc(100 * sizeof(int)); // Kein Aufruf von free(leakArr), Speicher geht verloren }

Geschichte

In einem Projekt haben Programmierer Speicher für eine Struktur, die eine Benutzersitzung beschreibt, über malloc zugewiesen, aber vergessen, free am Ende der Sitzung aufzurufen. Infolgedessen verlor das Projekt über mehrere Tage Speicher, der Server „stürzte“ mit einem Speichermangel-Fehler ab. Das Problem wurde erst nach dem Profilieren mit Valgrind und der Behebung aller versäumten free-Aufrufe gelöst.


Geschichte

Ein Entwickler hat ein großes Array (bis zu 10 MB) im Stack für temporäre Berechnungen zugewiesen. Auf einem Server mit geringem Stackumfang führte dies zu einem Absturz der Anwendung mit einem Stack-Overflow-Fehler. Nach einer Analyse musste der Puffer in den Heap übertragen werden.


Geschichte

Einer der Entwickler beschloss, lange Strings im Stack zu speichern, aber die Länge des Strings wurde subjektiv vom Benutzer vorgegeben. Bei der Eingabe eines sehr langen Strings stürzte die Anwendung mit einem Zugriffsfehler ab. Schließlich wurde die Entscheidung getroffen, die eingegebenen Daten in den Heap mit Längenprüfungen zu übertragen.