
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! 🧠
🧠 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
#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; }
| Funktion | Zweck | Wichtig |
|---|---|---|
| malloc(n) | n Bytes anfordern | Gibt NULL zurück bei Fehler |
| calloc(n, size) | n × size Bytes, mit 0 initialisiert | Sicherer als malloc |
| realloc(p, n) | Speicherblock vergrößern | Kann Adresse ändern |
| free(p) | Speicher freigeben | Jedes malloc braucht ein free! |
| sizeof(typ) | Größe eines Typs in Bytes | sizeof(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
malloc-Aufrufe schreiben
Schreibe den korrekten malloc-Aufruf für:
- 50 int-Werte:
int *p = _______________________; - 20 float-Werte:
float *p = _______________________; - 100 Zeichen (String):
char *s = _______________________;
Dynamisches Array
Schreibe ein Programm, das n vom Benutzer einliest, n Zahlen dynamisch speichert und die Summe berechnet:
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: