_expand
Ändert die Größe eines Speicherblocks.
Syntax
void *_expand(
void *memblock,
size_t size
);
Parameter
memblock
Zeiger zum vorherigen belegten Speicherblock.
size
Neue Größe in Bytes.
Rückgabewert
_expand
gibt einen leeren Zeiger auf den neu belegten Speicherblock zurück. _expand
im Gegensatz dazu realloc
kann ein Block nicht verschoben werden, um seine Größe zu ändern. Wenn also genügend Arbeitsspeicher verfügbar ist, um den Block zu erweitern, ohne ihn zu verschieben, entspricht der memblock
Parameter _expand
dem Rückgabewert.
_expand
gibt NULL
zurück, wenn ein Fehler während des Vorgangs auftritt. Wenn _expand
z.B. verwendet wird, um einen Speicherblock zu verkleinern, könnte eine Beschädigung im kleinen Blockheap oder ein ungültiger Blockzeiger festgestellt und NULL
zurückgegeben werden.
Wenn nicht genügend Arbeitsspeicher verfügbar ist, um den Block zu erweitern, ohne ihn zu verschieben, wird die Funktion zurückgegeben NULL
. _expand
gibt einen Block zurück, der auf eine kleinere Größe als angegeben ausgedehnt wurde. Wenn ein Fehler auftritt, gibt errno
die Art des Fehlers an. Weitere Informationen zu errno
, sieheerrno
, , _doserrno
, _sys_errlist
und _sys_nerr
.
Der Rückgabewert verweist auf einen Speicherplatz, der für die Speicherung eines beliebigen Objekttyps entsprechend ausgerichtet ist. Verwenden Sie _msize
, um die neue Größe des Elements zu überprüfen. Um einen Zeiger auf einen anderen Typ als void
zurückzugeben, verwenden Sie eine Typumwandlung für den Rückgabewert.
Hinweise
Die _expand
-Funktion ändert die Größe eines zuvor belegten Speicherblocks, indem versucht wird, den Block ohne Verschieben seiner Position im Heap zu erweitern oder zu verkleinern. Der Parameter memblock
zeigt auf den Anfang des Blocks. Der Parameter size
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. memblock
sollte kein Block sein, der freigegeben wurde.
Hinweis
Auf 64-Bit-Plattformen verkleinert _expand
den Block möglicherweise nicht, wenn die neue Größe kleiner ist als die aktuelle Größe. Besonders wenn der Block kleiner als 16K war und daher im niedrigen Fragmentierungs-Heap belegt war, ändert _expand
den Block nicht und gibt memblock
zurück.
Wenn die Anwendung mit einer Debugversion der C-Laufzeitbibliotheken verknüpft ist, _expand
wird sie aufgelöst._expand_dbg
Weitere Informationen dazu, wie der Heap während des Debuggingvorgangs verwaltet wird, finden Sie im CRT-Debug-Heap.
Diese Funktion überprüft ihre Parameter. Wenn memblock
es sich um einen Nullzeiger handelt, ruft diese Funktion einen ungültigen Parameterhandler auf, wie in der Parameterüberprüfung beschrieben. Wenn die weitere Ausführung zugelassen wird, wird errno
auf EINVAL
festgelegt, und die Funktion gibt NULL
beschrieben. Ist size
größer als _HEAP_MAXREQ
, errno
wird auf ENOMEM
, und die Funktion wird zurückgegeben NULL
.
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
Funktion | Erforderlicher Header |
---|---|
_expand |
<malloc.h> |
Weitere Informationen zur Kompatibilität finden Sie unter Kompatibilität.
Beispiel
// crt_expand.c
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
int main( void )
{
char *bufchar;
printf( "Allocate a 512 element buffer\n" );
if( (bufchar = (char *)calloc( 512, sizeof( char ) )) == NULL )
exit( 1 );
printf( "Allocated %d bytes at %Fp\n",
_msize( bufchar ), (void *)bufchar );
if( (bufchar = (char *)_expand( bufchar, 1024 )) == NULL )
printf( "Can't expand" );
else
printf( "Expanded block to %d bytes at %Fp\n",
_msize( bufchar ), (void *)bufchar );
// Free memory
free( bufchar );
exit( 0 );
}
Allocate a 512 element buffer
Allocated 512 bytes at 002C12BC
Expanded block to 1024 bytes at 002C12BC