_expand
Ändert die Größe eines Speicherblocks.
void *_expand(
void *memblock,
size_t size
);
Parameter
memblock
zuvor Zeiger auf den belegten Speicherblock.size
Die neue Größe in Bytes.
Rückgabewert
_expand gibt einen void-Zeiger auf den neu zugeteilten Speicherblock zurück._expandGegensatz realloc, kann ein Block nicht verschieben, um seine Größe zu ändern.Wenn genügend Arbeitsspeicher vorhanden, erweitern den Block verfügbar ist, ohne es zu verschieben, besteht der memblock-Parameter in _expand derselbe wie der Rückgabewert.
_expand gibt NULL zurück, wenn ein Fehler während des Vorgangs erkannt wird.Wenn z. B. _expand verwendet wird, um einen Speicherblock zu verkleinern, hat es möglicherweise Beschädigung im kleinen Blocks heap oder ein ungültiger Zeiger und eine Rückgabe NULLblockieren.
Bei unzureichender Arbeitsspeicher, gibt er den der Block, der der angegebenen Größe zu erweitern verfügbar ist, ohne sie zu verschieben, gibt die Funktion NULLzurück._expand gibt nie einen Block zurück, der kleiner als die Größe der Anforderung erweitert wird.Wenn ein Fehler auftritt, wird 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 ein garantiert der Speicherplatz zum Speichern eines beliebigen Typs Objekt ordnungsgemäß ausgerichtet werden soll.Um die neue Größe des Elements überprüfen, verwenden Sie _msize.Um einen Zeiger auf einen anderen Typ als voidabzurufen, verwenden Sie eine Typumwandlung im Rückgabewert.
Hinweise
Die Funktion _expand ändert die Größe eines zuvor belegten Speicherblocks vom Versuchen, sich selbst zu erweitern oder zu verkleinern der Block, ohne dessen Position im Heap verschoben werden soll.Der memblock-Parameter zeigt auf den Anfang des Blocks.Der size-Parameter gibt die neue Größe des Blocks in Bytes.Der Inhalt des Blocks stehen bis zu dem alten und der neuen kürzeren Größe nicht geändert.memblock sollte kein Block sein, die freigegeben wurde.
Hinweis |
---|
Auf 64-Bit-Plattformen kann der Vertrag nicht _expand-Block, wenn die neue Größe kleiner ist als die aktuelle Größe. insbesondere wenn der Block kleiner als 16K Größe und daher im Basis- Fragmentierungs-Heap zugeordnet wurde, schlagen bei _expand den Block unverändert, und gibt memblockzurück. |
Wenn die Anwendung mit einer Debugversion der C-Laufzeitbibliotheken verknüpft ist, wird _expand zu _expand_dbgauf.Weitere Informationen darüber, wie der Heap während des Debuggens Prozesses verwaltet wird, finden Sie unter Der CRT-Debugheap.
Diese Funktion überprüft seine Parameter.Wenn memblock ein NULL-Zeiger ist, Aufrufe dieser Funktion ein ungültiger Parameter für, wie in Parametervalidierungbeschrieben.Wenn die Ausführung zulässig ist, um fortzufahren, wird errno zu EINVAL festgelegt, und die Funktion gibt NULLzurück.Wenn size größer als _HEAP_MAXREQist, wird errno zu ENOMEM festgelegt, und die Funktion gibt NULLzurück.
Anforderungen
Funktion |
Erforderlicher Header |
---|---|
_expand |
<malloc.h> |
Um Kompatibilität zusätzlichen Informationen finden Sie unter Kompatibilität in der Einführung.
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 );
}
.NET Framework-Entsprechung
Nicht zutreffend. Um die Standard-C-Funktion aufrufen, verwenden Sie PInvoke. Weitere Informationen finden Sie unter Plattformaufruf-Beispiele.