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
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.
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.
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.
Dynamische Speicherverwaltung III – realloc — häufigste Fragen
(ausklappen)
Dynamische Speicherverwaltung III – realloc — häufigste Fragen
(ausklappen)-
Wann sollte man realloc() in C verwenden?
realloc()verwendet man in C, wenn ein bereits mitmallocodercallocreservierter 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
reallocbleiben 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
reallocfehlschlägt undNULLzurü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
reallocspeichert man zuerst in eine zweite Variable, weilreallocbei einem FehlschlagNULLliefern 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.
