realloc

Neubelegung von Arbeitsspeicherblöcken.

Syntax

void *realloc(
   void *memblock,
   size_t size
);

Parameter

memblock
Zeiger zum vorherigen belegten Speicherblock.

size
Neue Größe in Bytes.

Rückgabewert

realloc gibt einen void-Zeiger auf den neu belegten (und möglicherweise verschobenen) Speicherblock zurück.

Wenn nicht genügend Arbeitsspeicher verfügbar ist, um den Block auf die angegebene Größe zu erweitern, bleibt der ursprüngliche Block unverändert und NULL wird zurückgegeben.

Wenn size 0 ist, wird der Block, auf den durch memblock gezeigt wird, freigegeben; der Rückgabewert ist NULL, und memblock zeigt auf den freigegebenen Block.

Der Rückgabewert verweist auf einen Speicherplatz, der für die Speicherung eines beliebigen Objekttyps entsprechend ausgerichtet ist. Um einen Zeiger auf einen anderen Typ als void zurückzugeben, verwenden Sie eine Typumwandlung für den Rückgabewert.

Hinweise

Hinweis

realloc wurde nicht aktualisiert, um das C17-Verhalten zu implementieren, da das neue Verhalten nicht mit dem Windows-Betriebssystem kompatibel ist.

Die realloc-Funktion ändert die Größe eines zugeordneten Speicherblocks. Das memblock-Argument zeigt auf den Anfang des Speicherblocks. Wenn memblockNULL ist, dann verhält sich realloc genauso wie malloc und weist einen neuen Block an size-Bytes zu. Andernfalls memblock NULLsollte es sich um einen Zeiger handelt, der von einem vorherigen Aufruf von calloc, oder malloc.realloc

Das size-Argument gibt die neue Größe des Blocks in Bytes an. Der Inhalt des Blocks bleibt bis zum Minimum von neuer und alter Größe unverändert, obwohl sich der neue Block an einem anderen Speicherort befinden kann. Da sich der neue Block an einer neuen Speicherposition befinden kann, ist der von realloc dem zurückgegebenen Zeiger nicht garantiert der Zeiger, der durch das memblock Argument übergeben wird. realloc 0 nicht neu zugeordneten Speicher, wenn Pufferwachstum vorhanden ist.

realloc setzt errno auf ENOMEM, wenn eine Speicherbelegung fehlschlägt oder wenn der benötigte Speicherplatz größer als _HEAP_MAXREQ ist. Informationen zu diesem und anderen Fehlercodes finden Sie unter , , _doserrno, _sys_errlistund _sys_nerr.errno

realloc Aufrufe malloc , um die C++ _set_new_mode -Funktion zum Festlegen des neuen Handlermodus zu verwenden. Der neue Handlermodus gibt an, ob bei einem Fehler malloc die neue Handlerroutine aufrufen soll, wie dies von _set_new_handler festgelegt ist. Ruft standardmäßig die neue Handlerroutine nicht auf, malloc wenn Speicher nicht zugewiesen werden kann. Sie können dieses Standardverhalten überschreiben, sodass, wenn realloc Speicher nicht belegen kann,malloc die neue Handlerroutine genauso aufruft wie der new-Operator, wenn dieser aus demselben Grund fehlschlägt. Um den Standardwert zu überschreiben, rufen Sie

_set_new_mode(1);

frühe Programme oder Verknüpfungen mit NEWMODE. OBJ (siehe Linkoptionen).

Wenn die Anwendung mit einer Debugversion der C-Laufzeitbibliotheken verknüpft ist, realloc wird sie aufgelöst._realloc_dbg Weitere Informationen dazu, wie der Heap während des Debuggingvorgangs verwaltet wird, finden Sie im CRT-Debug-Heap.

realloc ist markiert __declspec(noalias) und __declspec(restrict), was bedeutet, dass die Funktion garantiert nicht globale Variablen ändert, und dass der zurückgegebene Zeiger nicht aliast ist. Weitere Informationen finden Sie unter noalias und restrict.

Standardmäßig gilt der globale Zustand dieser Funktion für die Anwendung. Wie Sie dieses Verhalten ändern, erfahren Sie unter Globaler Status in der CRT.

Anforderungen

Routine Erforderlicher Header
realloc <stdlib.h> und <malloc.h>

Weitere Informationen zur Kompatibilität finden Sie unter Kompatibilität.

Beispiel

// crt_realloc.c
// This program allocates a block of memory for
// buffer and then uses _msize to display the size of that
// block. Next, it uses realloc to expand the amount of
// memory used by buffer and then calls _msize again to
// display the new amount of memory allocated to buffer.

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

int main( void )
{
   long *buffer, *oldbuffer;
   size_t size;

   if( (buffer = (long *)malloc( 1000 * sizeof( long ) )) == NULL )
      exit( 1 );

   size = _msize( buffer );
   printf_s( "Size of block after malloc of 1000 longs: %u\n", size );

   // Reallocate and show new size:
   oldbuffer = buffer;     // save pointer in case realloc fails
   if( (buffer = realloc( buffer, size + (1000 * sizeof( long )) ))
        ==  NULL )
   {
      free( oldbuffer );  // free original block
      exit( 1 );
   }
   size = _msize( buffer );
   printf_s( "Size of block after realloc of 1000 more longs: %u\n",
            size );

   free( buffer );
   exit( 0 );
}
Size of block after malloc of 1000 longs: 4000
Size of block after realloc of 1000 more longs: 8000

Siehe auch

Speicherzuweisung
calloc
free
malloc