====== realloc() ====== realloc ist definiert in der ''[[start|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 [[c:lib:stddef:null|NULL]] zurückgegeben, realloc() entspricht hier einem [[free|free()]]-Aufruf. Wird für den alten Speicherblock der [[c:lib:stddef:null|NULL]]-Pointer, entspricht realloc() einem [[malloc|malloc()]]-Aufruf. ===== Signatur ===== #include 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 [[c:lib:stddef:null|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 [[c:cast|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|free()]] wieder freigegeben werden. ===== Beispiel ===== #include 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 ===== [[free]], [[malloc]], [[calloc]]