Mit realloc vergrößern
Ändern Sie die Größe eines dynamischen Arrays.
Mit realloc vergrößern ist eine kostenlose C Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C Academy-Kurs umfasst insgesamt 4 Lektionen.
Wenn ein malloc nicht ausreicht
Manchmal reservieren Sie ein Array, füllen es und stellen anschließend fest, dass Sie mehr Platz benötigen. Sie können nicht einfach über das Ende hinaus schreiben.
Mit realloc können Sie einen vorhandenen Heap-Block vergrößern oder verkleinern und dabei die bereits vorhandenen Daten behalten.
Die Signatur von realloc
realloc(ptr, new_bytes) übernimmt den alten Zeiger und die neue Gesamtgröße in Bytes.
Die Funktion gibt einen Zeiger auf einen Block der neuen Größe zurück. Der erste Teil der Daten bleibt bis zur kleineren der alten und neuen Größen erhalten.
int *bigger = realloc(a, new_n * sizeof(*a));Der Block kann verschoben werden
realloc kann den Block an Ort und Stelle vergrößern oder einen neuen Block reservieren, Ihre Daten kopieren und den alten Block freigeben.
In beiden Fällen kann der alte Zeiger ungültig werden. Von nun an müssen Sie den zurückgegebenen Zeiger verwenden.
a = realloc(a, new_n * sizeof(*a));
/* the old value of a may no longer be valid */Die Falle bei der Selbstzuweisung
a = realloc(a, ...) wirkt zwar übersichtlich, ist aber gefährlich: Wenn realloc NULL zurückgibt, haben Sie a überschrieben und den ursprünglichen Zeiger verloren. Dadurch bleibt der alte Block belegt.
Verwenden Sie stattdessen eine temporäre Variable.
int *tmp = realloc(a, new_n * sizeof(*a));
if (tmp == NULL) { /* a is still valid */ return 1; }
a = tmp;Ein Array sicher vergrößern
Dieses Programm reserviert zunächst Platz für 3 Integer und vergrößert ihn anschließend mit realloc auf 6. Dabei bleiben die ersten drei Werte erhalten.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *a = malloc(3 * sizeof(*a));
if (!a) return 1;
for (int i = 0; i < 3; i++) a[i] = i + 1;
int *tmp = realloc(a, 6 * sizeof(*a));
if (!tmp) { free(a); return 1; }
a = tmp;
for (int i = 3; i < 6; i++) a[i] = i + 1;
for (int i = 0; i < 6; i++) printf("%d\n", a[i]);
free(a);
return 0;
}Neue Bytes sind nicht initialisiert
Wenn Sie einen Block vergrößern, enthält der zusätzliche Speicher am Ende beliebige Daten, genau wie frisch reservierter malloc-Speicher.
realloc erhält Ihre alten Daten, setzt den neuen Bereich aber nicht auf null. Initialisieren Sie ihn, bevor Sie ihn lesen.
a = realloc(a, 6 * sizeof(*a));
for (int i = 3; i < 6; i++) a[i] = 0; /* clear new slots */Die Verdopplungsstrategie
realloc für jedes einzelne Element aufzurufen ist langsam. Ein klassischer Ansatz besteht darin, die Kapazität jedes Mal zu verdoppeln, wenn der Platz nicht mehr ausreicht.
Dadurch bleibt die Anzahl der realloc-Aufrufe beim Wachstum des Arrays gering, was im Durchschnitt eine gute Leistung ergibt.
if (count == cap) {
cap = cap ? cap * 2 : 4;
int *tmp = realloc(a, cap * sizeof(*a));
if (!tmp) { free(a); return 1; }
a = tmp;
}Ein Array durch Anhängen aufbauen
Dieses Programm startet mit einem leeren Array und hängt Zahlen an. Bei Bedarf wird die Kapazität verdoppelt.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *a = NULL;
size_t count = 0, cap = 0;
for (int v = 1; v <= 5; v++) {
if (count == cap) {
cap = cap ? cap * 2 : 2;
int *tmp = realloc(a, cap * sizeof(*a));
if (!tmp) { free(a); return 1; }
a = tmp;
}
a[count++] = v;
}
for (size_t i = 0; i < count; i++) printf("%d\n", a[i]);
free(a);
return 0;
}realloc(NULL, n) verhält sich wie malloc
Wenn Sie als Zeiger NULL übergeben, verhält sich realloc genau wie malloc.
Deshalb funktioniert der Start mit a = NULL in der Verdopplungsschleife: Der erste realloc-Aufruf reserviert den anfänglichen Block.
int *a = NULL;
a = realloc(a, 4 * sizeof(*a)); /* same as malloc(4 * sizeof(*a)) */Einen Block verkleinern
realloc kann einen Block auch verkleinern. Die Daten bis zur neuen Größe bleiben erhalten; der Rest wird verworfen.
Beim Verkleinern kann Speicher wieder freigegeben werden, allerdings dürfen Implementierungen den größeren Block behalten.
int *tmp = realloc(a, 2 * sizeof(*a)); /* down from more */
if (tmp) a = tmp;Überlauf in Berechnungen vermeiden
Wenn die Kapazität groß wird, kann cap * sizeof(*a) bei der Berechnung einen Überlauf von size_t verursachen und sich auf eine winzige Zahl zurückfalten.
Bei sehr großen Arrays sollten Sie die Multiplikation absichern oder auf Systemen, die dies anbieten, reallocarray verwenden.
if (cap > SIZE_MAX / sizeof(*a)) { /* overflow */ return 1; }
int *tmp = realloc(a, cap * sizeof(*a));Kurzer Test
Testen Sie Ihr Verständnis von realloc.
Zusammenfassung
realloc ändert die Größe eines Heap-Blocks und verschiebt ihn möglicherweise. Verwenden Sie daher immer den zurückgegebenen Pointer.
Weisen Sie das Ergebnis zunächst einer temporären Variable zu, damit ein Fehlschlag den ursprünglichen Block nicht verliert. Verdoppeln Sie die Größe für mehr Geschwindigkeit, initialisieren Sie neue Elemente und denken Sie daran: realloc(NULL, n) entspricht malloc. Als Nächstes kapseln Sie diese Logik in einem wiederverwendbaren Vektor-Typ.
Häufig gestellte Fragen
Ist die Lektion „Mit realloc vergrößern“ kostenlos?
Ja — der vollständige Text von „Mit realloc vergrößern“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Mit realloc vergrößern“?
Ändern Sie die Größe eines dynamischen Arrays. Du übst C Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um C Academy zu starten?
Keine Vorkenntnisse erforderlich. C Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.
Wie lange dauert die Lektion „Mit realloc vergrößern“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser C Academy-Lektion Code schreiben und ausführen?
Ja. Jede C Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Ein Array allozieren
- Mit realloc vergrößern
- Ein wiederverwendbarer Vektortyp
- Freigeben und Leaks vermeiden