realloc()

realloc ist definiert in der stdlib, die in C über stdlib.h, bzw. in C++ über cstdlib eingebunden wird.

Funktion

Vergrößert bzw. verkleinert die Größe des übergebenden Speicherblocks entsprechend der angeforderten Größe. Dazu kann realloc() die vorhandenen Daten an einen neuen Ort kopieren und den bisher genutzten Speicher freigeben. Unabhängig davon, ob die Daten an einen neuen Ort kopiert werden oder nicht, es ist garantiert, dass die Daten erhalten bleiben. Ist der neue Block größer, so wird der alte Block vollständig kopiert. Ist der neue Block kleiner, so werden die Daten bis zur Größe des neuen Blocks kopiert, alles weitere wird gelöscht.

Ist die neue angeforderte Größe 0, so wird der alte Block freigegeben und NULL zurückgegeben, realloc() entspricht hier einem free()-Aufruf. Wird für den alten Speicherblock der NULL-Pointer, entspricht realloc() einem malloc()-Aufruf.

Signatur

#include <stdlib.h>
void * realloc ( void * datablock, size_t size );

datablock: Zeiger auf den alten Datenblock
size: Neue Größe des Speicherblocks.

Bemerkungen

Die Rückgabe ist ein Zeiger auf das erste Byte des zugeteilten Speicherblocks (oder NULL, falls kein Speicher zugeteilt wurde) und wird als Datentyp (void *) geliefert. In C wird (void *) auf jeden beliebigen Zeigerdatentyp implizit konvertiert. In C++ muss gecasted werden. Da viele C Programme mit C++ Compilern kompiliert werden, sollte der Typ inzwischen grundsätzlich als Cast vor den calloc()-Aufruf gesetzt werden.

Sobald Arbeitsspeicher nicht mehr benötigt wird, muss er mit der Funktion free() wieder freigegeben werden.

Beispiel

#include <stdlib.h>
 
int main( void )
{
  int * integers;
 
  integers = (int *)calloc( 10, sizeof( int ) );    // Ein Array von 10 Datensätzen in der Größe von jeweils einem Integers anfordern
 
  if( integers )
  {
    /* .... */
 
    integers = (int *)realloc( integers, sizeof( int ) * 12 ); // Mehr Speicher anfordern
 
    /* .... */
 
    integers = (int *)realloc( integers, sizeof( int ) * 8 );  // Weniger Speicher anfordern
 
    /* .... */
 
    free( integers );                               // Speicher freigeben
    return EXIT_SUCCESS; 
  }
 
  return EXIT_FAILURE;
}

siehe auch