Video

Dynamische Speicherverwaltung III – realloc

Wenn du bereits weißt wie man Speicher reserviert und freigibt, lernst du nun in diesem Beitrag wie man ihn zusätzlich manipulieren kann.

Inhaltsübersicht

Anpassung des Speicherbereichs durch realloc

Wie alle Funktionen zur dynamischen Speicherverwaltung finden wir auch realloc in der Standard-Bibliothek. Ihr Prototyp sieht in etwa so aus:

Dynamische Speicherverwaltung, realloc
direkt ins Video springen
Prototyp realloc

Ablauf der Speichermanipulation

Aber was macht sie überhaupt und wie verwendest du sie? Realloc versucht deinen bereits durch malloc oder calloc reservierten dynamischen Speicherbereich anzupassen, indem sie ihn vergrößert oder verkleinert. Was von beidem der Fall ist, hängt von den angegebenen Parametern, im Speziellen der Bezeichnung des gewünschten Bereiches und der gewünschten Größe dieses Bereiches, ab. Gibst du hier nur Blödsinn ein oder die Ausführung scheitert aus einem anderen Grund, erhältst du als Rückgabe den Wert NULL und der gesamte Bereich bleibt unberührt.

Dynamische Speicherverwaltung, realloc
direkt ins Video springen
Bei Eingabe von ungültigen Werten ist der Rückgabewert NULL

Hältst du dich aber an alle Vorschriften und es treten auch keine sonstigen Fehler auf, erhältst du dagegen die Adresse des neu reservierten Speicherplatzes zurück.

Dynamische Speicherverwaltung, realloc
direkt ins Video springen
Korrekte Eingabe liefert die Adresse des neu reservierten Speicherplatzes
Studyflix vernetzt: Hier ein Video aus einem anderen Bereich

Umwandlung von realloc in malloc oder free

Zusätzlich dazu kann realloc aber auch mit ungültigem p gültige Werte liefern. Das ist dann der Fall, wenn p entweder NULL ist oder size 0 beträgt. Ist ersteres der Fall, fungiert realloc nicht als Speichermanipulation, sondern als Speicherreservierung, denn sie wird praktisch zu malloc. Tritt letzterer Fall ein, funktioniert realloc wie das Gegenteil einer Reservierung, denn sie gibt nun den reservierten Platz wieder frei und wird damit effektiv zu free.

Dynamische Speicherverwaltung, realloc
direkt ins Video springen
Ungültiges p kann realloc in malloc oder free umwandeln

Anwendung realloc – Beispiel

Aber genug mit der Theorie. Wie sieht so etwas denn in der Praxis aus? Ganz einfach. Entweder so:

Dynamische Speicherverwaltung, realloc
direkt ins Video springen
Anwendung realloc

oder so:

Dynamische Speicherverwaltung, realloc
direkt ins Video springen
Anwendung realloc

Es handelt sich also entweder um eine Vergrößerung oder eine Verkleinerung des Speichers. Im ersten Fall wird sofort versucht, den vorhandenen Speicherblock zusammenhängend zu erweitern. Ist das nicht möglich, z.B. weil dort bereits ein Datensatz gespeichert ist, wird stattdessen ein komplett neuer Speicherbereich in der gewünschten Größe an einem anderen Punkt reserviert. Der alte Bereich wird dann freigegeben.

Dynamische Speicherverwaltung, realloc
direkt ins Video springen
Vergrößerung des Speichers

Verkleinerst du den vorhandenen Speicher, kannst du dir das vorstellen, als würdest du einfach den nicht mehr benötigten Teil des reservierten Speicherbereiches abschneiden. Der Inhalt des übrig gebliebenen Bereichs bleibt erhalten, der restliche Speicher wird erneut freigegeben.

Dynamische Speicherverwaltung, realloc
direkt ins Video springen
Verkleinerung des Speichers

Super, jetzt weißt du auch was es mit der Speicherverwaltung realloc auf sich hat und kannst sie gleich anwenden.

Dynamische Speicherverwaltung III – realloc — häufigste Fragen

(ausklappen)
  • Wann sollte man realloc() in C verwenden?
    realloc() verwendet man in C, wenn ein bereits mit malloc oder calloc reservierter Speicherbereich später eine andere Größe haben soll, ohne dass man komplett neu planen muss. Typisch ist das bei dynamischen Arrays, wenn während der Laufzeit mehr oder weniger Elemente benötigt werden.
  • Bleiben die bisherigen Daten nach realloc erhalten, wenn der Speicherblock verschoben wird?
    Bei realloc bleiben die bisherigen Daten auch dann erhalten, wenn der Speicherblock an eine neue Adresse verschoben wird, weil der Inhalt in den neuen Bereich übernommen wird. Erhalten bleibt der Teil, der in die neue Größe noch hineinpasst, also bis zur kleineren der beiden Größen.
  • Was passiert mit dem alten Speicher, wenn realloc fehlschlägt und NULL zurückgibt?
    Wenn realloc fehlschlägt und NULL zurückgibt, bleibt der alte Speicherbereich unverändert reserviert und wird nicht freigegeben. Dadurch kann man weiterhin mit dem bisherigen Zeiger arbeiten und den Speicher später regulär freigeben, statt ihn unbeabsichtigt zu verlieren.
  • Warum sollte man den Rückgabewert von realloc zuerst in eine zweite Variable speichern?
    Den Rückgabewert von realloc speichert man zuerst in eine zweite Variable, weil realloc bei einem Fehlschlag NULL liefern kann. Würde man direkt den alten Zeiger überschreiben, wäre die Adresse des bisherigen Speicherblocks weg, obwohl der Block noch existiert.

Speicherverwaltung verstehen

realloc gehört zur dynamischen Speicherverwaltung in C und ist ein wichtiges Werkzeug für Programme mit flexiblem Speicherbedarf. Du arbeitest in diesem Themenfeld mit Speicherblöcken, Zeigern und Funktionen zum Reservieren, Anpassen und Freigeben von Speicher. Dabei wird klar, wie Adressen, Rückgabewerte und NULL zusammenhängen und warum sauberer Umgang mit Zeigern Fehler im Programm vermeidet. Weitere Videos dazu findest du in unserem Informatikbereich.

Lernen lohnt sich! Entdecke hier deine Chancen.