ProgrammierungC Entwickler

Beschreiben Sie den Mechanismus der dynamischen Speicherzuweisung und -freigabe in C, die wichtigsten Funktionen (malloc, calloc, realloc, free) und häufige Fehler bei deren Verwendung.

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

Antwort

In der Programmiersprache C werden Funktionen aus der Bibliothek stdlib.h für die dynamische Speicherverwaltung verwendet:

  • malloc(size_t size) — weist einen Speicherblock der angegebenen Größe zu. Der Speicher ist nicht initialisiert.
  • calloc(size_t nmemb, size_t size) — weist einen Speicherblock für ein Array von nmemb Elementen der angegebenen Größe zu und initialisiert ihn mit Nullen.
  • realloc(void *ptr, size_t size) — ändert die Größe eines zuvor zugewiesenen Speicherblocks.
  • free(void *ptr) — gibt den zuvor zugewiesenen Block frei.

Beispiel für die Verwendung:

int *arr = (int *)malloc(10 * sizeof(int)); if (arr == NULL) { // Fehlerbehandlung für Speicherzuweisung } // ... Arbeiten mit arr ... free(arr);

Es ist wichtig, immer das Ergebnis der Speicherzuweisung auf NULL zu überprüfen und free aufzurufen, um Speicherlecks zu vermeiden.

Fangfrage

Was wird das Ergebnis des folgenden Codes sein?

int *arr = malloc(sizeof(int) * 5); free(arr); free(arr);

Antwort: Ein wiederholter Aufruf von free für denselben Speicherbereich führt zu undefiniertem Verhalten. Man kann denselben Zeiger nur einmal freigeben.

Beispiele tatsächlicher Fehler aufgrund mangelnden Wissens über die Feinheiten des Themas


Geschichte

In einem Projekt zur Automatisierung von Tests gab es regelmäßige Abstürze. Der Schuldige war ein Systemzyklus, in dem nach jedem Durchlauf vergessen wurde, den über malloc zugewiesenen Speicher freizugeben. Infolgedessen hat das System bei langen Tests den gesamten Arbeitsspeicher "aufgebraucht" und ist abgestürzt.


Geschichte

Die Implementierung eines dynamischen Arrays verwendete realloc, ohne das Rückgaberesultat zu überprüfen. Bei einem Fehlschlag (realloc gab NULL zurück) wurde der Zeiger auf den alten Speicher verloren, was zu einem Speicherleak führte. Ein nachfolgender Versuch, mit dem Speicher zu arbeiten, führte zu einem Segfault.


Geschichte

Einem Entwickler wurde aufgetragen, ein veraltetes C-Modul zu integrieren, bei dem der Speicher über free zweimal hintereinander mit demselben Zeiger freigegeben wurde. Auf den meisten Betriebssystemen traten keine Fehler auf, aber auf einer neuen Plattform stürzte die Anwendung ab; die Ursache wurde erst nach langer Zeit entdeckt: Double-Free.