Zeiger & Speicher Unit 3 von 3 Theorie + Übungen Dauer: ~45 Min.
Ömer
Ömer sagt:

Bisher haben wir die Array-Größe immer beim Compilieren festgelegt. Was aber wenn wir erst zur Laufzeit wissen, wie viel Speicher wir brauchen? Dafür gibt es malloc und free – dynamische Speicherverwaltung! 🧠

malloc – Speicher anfordern free – Speicher freigeben sizeof Operator NULL-Check Memory Leak vermeiden

🧠 Heap vs. Stack

📦 Stack (automatisch)

Lokale Variablen und Arrays mit fester Größe. Automatisch verwaltet. Begrenzt (~1-8 MB).

int arr[100]; → Stack

🏗️ Heap (dynamisch)

Mit malloc angefordert. Manuell mit free freigeben. Viel größer.

int *arr = malloc(...); → Heap

💻 malloc und free

malloc_demo.cC
#include <stdio.h>
#include <stdlib.h>   // für malloc und free

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

    /* Speicher für n int-Werte anfordern */
    int *arr = (int*) malloc(n * sizeof(int));

    /* IMMER prüfen ob malloc erfolgreich war! */
    if (arr == NULL) {
        printf("Fehler: kein Speicher!\n");
        return 1;
    }

    /* Array benutzen */
    for (int i=0; i<n; i++) arr[i] = i * 10;
    for (int i=0; i<n; i++) printf("%d ", arr[i]);

    /* Speicher freigeben! */
    free(arr);
    return 0;
}
FunktionZweckWichtig
malloc(n)n Bytes anfordernGibt NULL zurück bei Fehler
calloc(n, size)n × size Bytes, mit 0 initialisiertSicherer als malloc
realloc(p, n)Speicherblock vergrößernKann Adresse ändern
free(p)Speicher freigebenJedes malloc braucht ein free!
sizeof(typ)Größe eines Typs in Bytessizeof(int)=4, sizeof(char)=1

⚠️ Memory Leak – der unsichtbare Bug

Wenn du vergisst free() aufzurufen, bleibt der Speicher belegt bis das Programm endet. Bei langen Programmen kann das alle RAM aufbrauchen. Regel: Jedes malloc braucht genau ein free!

✏️ Übungen

Übung 1

malloc-Aufrufe schreiben

Schreibe den korrekten malloc-Aufruf für:

  1. 50 int-Werte: int *p = _______________________;
  2. 20 float-Werte: float *p = _______________________;
  3. 100 Zeichen (String): char *s = _______________________;
Format: (Typ*) malloc(Anzahl * sizeof(Typ));
Übung 2 – Programm

Dynamisches Array

Schreibe ein Programm, das n vom Benutzer einliest, n Zahlen dynamisch speichert und die Summe berechnet:

#include <stdio.h> #include <stdlib.h> int main() { int n, summe = 0; printf("Anzahl: "); scanf("%d", &n); int *arr = (int*) malloc(n * sizeof(int)); if (arr == NULL) { printf("Fehler!\n"); return 1; } for (int i = 0; i < n; i++) { printf("Zahl %d: ", i+1); scanf("%d", &arr[i]); summe += arr[i]; } printf("Summe: %d\n", summe); free(arr); return 0; }
Übung 3 – Bonus

Dynamisch wachsendes Array mit realloc

realloc vergrößert einen bereits allokierten Speicherblock. Schreibe ein Programm, das Zahlen einliest bis der Benutzer 0 eingibt, und das Array dabei schrittweise wachsen lässt:

#include <stdio.h> #include <stdlib.h> int main() { int *arr = NULL; int anzahl = 0; int eingabe; printf("Zahlen eingeben (0 = Ende):\n"); while (1) { printf("Zahl %d: ", anzahl + 1); scanf("%d", &eingabe); if (eingabe == 0) break; /* Array um 1 Element vergroessern */ arr = (int*) realloc(arr, (anzahl + 1) * sizeof(int)); if (arr == NULL) { printf("Speicherfehler!\n"); return 1; } arr[anzahl] = eingabe; anzahl++; } printf("Eingegeben (%d Zahlen): ", anzahl); for (int i = 0; i < anzahl; i++) printf("%d ", arr[i]); printf("\n"); free(arr); return 0; }
realloc(NULL, size) verhält sich wie malloc – daher ist arr = NULL am Anfang korrekt. Immer den Rückgabewert prüfen: bei Fehler gibt realloc NULL zurück!