_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 void-Zeiger auf den neu zugeordneten Speicherblock zurück. _expand kann im Gegensatz zu realloc einen Block nicht verschieben, 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 während des Vorgangs ein Fehler erkannt wird. Wenn beispielsweise _expand verwendet wird, um einen Speicherblock zu verkleinern, kann dies eine Beschädigung im kleinen Blockheap oder einen ungültigen Blockzeiger erkennen und NULL zurückgeben.

Wenn nicht genügend Arbeitsspeicher verfügbar ist, um den Block auf die angegebene Größe zu erweitern, ohne ihn zu verschieben, gibt die Funktion NULL zurück. _expand gibt niemals einen Block zurück, der auf eine Größe erweitert ist, die kleiner als angefordert ist. Wenn ein Fehler auftritt, gibt errno die Art des Fehlers an. Weitere Informationen zu errno finden Sie unter errno, _doserrno, _sys_errlist und _sys_nerr.

Der Rückgabewert zeigt auf einen Speicherplatz, der für die Speicherung eines beliebigen Objekttyps geeignet 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.

Bemerkungen

Die _expand-Funktion ändert die Größe eines zuvor zugeordneten Speicherblocks, indem versucht wird, den Block zu erweitern oder zu verkingen, ohne seine Position im Heap zu verschieben. Der memblock-Parameter 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 darf kein freigegebener Block sein.

Hinweis

Auf 64-Bit-Plattformen kann _expand den Block möglicherweise nicht verkneinern, wenn die neue Größe kleiner als die aktuelle Größe ist. insbesondere, wenn der Block kleiner als 16.000 war und daher im Heap mit niedriger Fragmentierung zugeordnet wurde, bleibt _expand den Block unverändert und gibt memblock zurück.

Wenn die Anwendung mit einer Debugversion der C-Laufzeitbibliotheken verknüpft ist, wird _expand in _expand_dbg aufgelöst. Weitere Informationen dazu, wie der Heap während des Debugprozesses verwaltet wird, finden Sie unter The CRT Debug Heap (CRT-Debugheap).

Diese Funktion überprüft ihre Parameter. Wenn memblock ein NULL-Zeiger ist, ruft diese Funktion einen Handler für ungültige Parameter auf, wie unter Parametervalidierung beschrieben. Wenn die weitere Ausführung zugelassen wird, wird errno auf EINVAL festgelegt, und die Funktion gibt NULL zurück. Wenn size größer als _HEAP_MAXREQ ist, wird errno auf ENOMAM festgelegt, und die Funktion gibt NULL zurück.

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

Anforderungen

Funktion Erforderlicher Header
_expand <malloc.h>

Zusätzliche Informationen zur Kompatibilität finden Sie unter Compatibility.

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

Siehe auch

Speicherbelegung
calloc
free
malloc
_msize
realloc