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 memblock
NULL
ist, dann verhält sich realloc
genauso wie malloc
und weist einen neuen Block an size
-Bytes zu. Andernfalls memblock
NULL
sollte 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_errlist
und _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