Freigeben über


_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. _expandim Gegensatz dazu reallockann 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_errlistund _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 NULLbeschrieben. 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. Informationen zum Ändern dieses Verhaltens finden Sie im Global state in the 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

Siehe auch

Speicherzuweisung
calloc
free
malloc
_msize
realloc