Malloc

Aus dev.kaibel.net
Version vom 21. Oktober 2025, 12:46 Uhr von PhilKa (Diskussion | Beiträge) (Parameter)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

malloc (C-Funktion)

Die Funktion malloc() (memory allocation) gehört zur Standardbibliothek der Programmiersprache C und dient der dynamischen Speicherreservierung während der Programmlaufzeit. Sie wird in der Header-Datei <stdlib.h> deklariert.

Zweck

Im Gegensatz zu statischen Variablen (die beim Kompilieren eine feste Größe haben) ermöglicht malloc(), Speicher dynamisch zur Laufzeit aus dem Heap anzufordern. Dies ist besonders nützlich, wenn die benötigte Speichergröße erst während der Programmausführung bekannt ist – etwa bei Benutzereingaben, dynamischen Arrays oder verketteten Listen.

---

Syntax

#include <stdlib.h>

void* malloc(size_t size);

Parameter

  • size – Anzahl der Bytes, die reserviert werden sollen.
    • Der Datentyp size_t ist ein ganzzahliger Typ, der für Speichergrößen verwendet wird.

Rückgabewert

  • Gibt einen Zeiger (void*) auf den Anfang des reservierten Speicherbereichs zurück, falls die Zuweisung erfolgreich war.
  • Gibt NULL zurück, wenn der Speicher nicht zugewiesen werden konnte (z. B. bei Speichermangel).

---

Beispiel: Einfacher Speicherblock

#include <stdio.h>
#include <stdlib.h>

int main() {
    int* ptr;

    // Speicher für 10 int-Werte reservieren
    ptr = (int*) malloc(10 * sizeof(int));

    if (ptr == NULL) {
        printf("Fehler: Speicher konnte nicht zugewiesen werden.\n");
        return 1;
    }

    // Speicher verwenden
    for (int i = 0; i < 10; i++) {
        ptr[i] = i * 2;
        printf("ptr[%d] = %d\n", i, ptr[i]);
    }

    // Speicher wieder freigeben
    free(ptr);

    return 0;
}

Ausgabe:

ptr[0] = 0
ptr[1] = 2
ptr[2] = 4
...
ptr[9] = 18

---

Verwendungshinweise

1. Typumwandlung (Cast)

In C ist ein expliziter Typ-Cast beim Rückgabewert von malloc() **nicht erforderlich** (und teils unerwünscht):

// Empfohlen:
int* ptr = malloc(10 * sizeof(int));

Ein Cast ist nur in C++ nötig:

int* ptr = (int*) malloc(10 * sizeof(int)); // in C++ erforderlich

---

2. Speicherfreigabe mit free()

Der mit malloc() angeforderte Speicher muss mit free() wieder freigegeben werden, um Speicherlecks zu vermeiden:

free(ptr);
ptr = NULL; // optional, um Dangling Pointer zu vermeiden

---

3. Initialisierung des Speichers

Der von malloc() bereitgestellte Speicher ist **nicht initialisiert** – der Inhalt ist undefiniert. Wenn du den Speicher automatisch mit Nullen füllen möchtest, verwende stattdessen:

  • calloc() – für nullinitialisierten Speicher
  • memset() – zum nachträglichen Setzen von Werten

Beispiel:

int* ptr = calloc(10, sizeof(int)); // automatisch mit 0 belegt

---

4. Fehlerbehandlung

Wenn malloc() keinen Speicher mehr findet, liefert es NULL. Beispiel:

int* p = malloc(1000000000000);
if (p == NULL) {
    fprintf(stderr, "Speicherzuweisung fehlgeschlagen!\n");
    exit(EXIT_FAILURE);
}

---

5. Reallokation mit realloc()

Wenn du später mehr (oder weniger) Speicher benötigst, kannst du den vorhandenen Bereich mit realloc() anpassen:

int* p = malloc(5 * sizeof(int));
p = realloc(p, 10 * sizeof(int));

---

Beispiel: Dynamisches Array

#include <stdio.h>
#include <stdlib.h>

int main() {
    int n;
    printf("Wie viele Zahlen? ");
    scanf("%d", &n);

    int* arr = malloc(n * sizeof(int));
    if (arr == NULL) {
        printf("Fehler bei Speicherzuweisung\n");
        return 1;
    }

    for (int i = 0; i < n; i++) {
        arr[i] = i + 1;
    }

    printf("Eingegebene Zahlen:\n");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }

    free(arr);
    return 0;
}

---

Typische Fehlerquellen

  • Vergessen von free()Speicherleck
  • Zugriff außerhalb des reservierten Bereichs → undefiniertes Verhalten
  • Verwendung nach free()Dangling Pointer
  • Keine Prüfung auf NULL nach malloc()

---

Verwandte Funktionen

---

Siehe auch

Quellen

  • ISO/IEC 9899:2018 (C18) – Programming Language C
  • Kernighan, Brian W.; Ritchie, Dennis M.: The C Programming Language. Prentice Hall, 1988.
  • GNU C Library Documentation
  • man 3 malloc