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:
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.
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.
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.
Anwendung realloc – Beispiel
Aber genug mit der Theorie. Wie sieht so etwas denn in der Praxis aus? Ganz einfach. Entweder so:
oder so:
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.
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.
Super, jetzt weißt du auch was es mit der Speicherverwaltung realloc auf sich hat und kannst sie gleich anwenden.