realloc
Arbeiten hinter den Kulissen in etwa wie folgt aus:
- Wenn es hinter dem aktuellen Block genügend freier Speicherplatz vorhanden ist, um die Anforderung zu erfüllen, den aktuellen Block erstrecken und einen Zeiger auf den Anfang des Blocks zurückkehren .
- Sonst, wenn an anderer Stelle ein ausreichend großer freier Block vorhanden ist, dann diesen Block zuweisen, die Daten aus dem alten Block kopieren, den alten Block freigeben und einen Zeiger an den Anfang des neuen Blocks zurückgeben
Rückgabe
NULL
.
So können Sie für Fehler testen, indem Sie für NULL
testen, aber bewusst sein, dass Sie nicht überschreiben die alten Zeiger zu früh:
int* p = malloc(x);
/* ... */
p = realloc(p, y); /* WRONG: Old pointer lost if realloc fails: memory leak! */
/* Correct way: */
{
int* temp = realloc(p, y);
if (NULL == temp)
{
/* Handle error; p is still valid */
}
else
{
/* p now possibly points to deallocated memory. Overwrite it with the pointer
to the new block, to start using that */
p = temp;
}
}
Ist das 'Realloc' für alle Implementierungen? –
@CoolGuy: Einige Implementierungen könnten diesen ersten Schritt zur Erweiterung des aktuellen Blocks nicht ausführen (können), aber ansonsten ist dies das beobachtbare Verhalten von 'realloc' für alle Implementierungen. –