_expand
Změní velikost bloku paměti.
Syntaxe
void *_expand(
void *memblock,
size_t size
);
Parametry
memblock
Ukazatel na dříve přidělený blok paměti
size
Nová velikost v bajtech
Vrácená hodnota
_expand
vrátí ukazatel void na relokovaný blok paměti. _expand
, na rozdíl od realloc
, nemůže přesunout blok změnit jeho velikost. Pokud je tedy k dispozici dostatek paměti pro rozbalení bloku bez přesunutí, memblock
je parametr _expand
stejný jako vrácená hodnota.
_expand
vrátí NULL
, když se během operace zjistí chyba. Pokud _expand
se například používá ke zmenšení bloku paměti, může zjistit poškození v malé haldě bloku nebo neplatný ukazatel bloku a vrátit NULL
.
Pokud není k dispozici dostatek paměti pro rozbalení bloku bez přesunutí, vrátí NULL
funkce . _expand
nikdy nevrátí blok rozbalený na velikost menší, než je požadováno. Pokud dojde k selhání, errno
označuje povahu selhání. Další informace o errno
, vizerrno
, _doserrno
, _sys_errlist
, a _sys_nerr
.
Návratová hodnota odkazuje na prostor úložiště, který je vhodně zarovnaný pro úložiště libovolného typu objektu. Chcete-li zkontrolovat novou velikost položky, použijte _msize
. Pokud chcete získat ukazatel na jiný typ než void
, použijte přetypování typu na návratovou hodnotu.
Poznámky
Funkce _expand
změní velikost dříve přiděleného bloku paměti tím, že se pokusí rozbalit nebo uzavřít blok bez přesunutí jeho umístění v haldě. Parametr memblock
odkazuje na začátek bloku. Parametr size
poskytuje novou velikost bloku v bajtech. Obsah bloku se nezmění až na kratší velikost nových a starých velikostí. memblock
nemělo by to být blok, který byl uvolněn.
Poznámka:
Na 64bitových platformách nemusí být blok kontraktován, _expand
pokud je nová velikost menší než aktuální velikost; zejména pokud byl blok menší než 16 tisíc, a proto přidělen v haldě s nízkou fragmentací, _expand
ponechá blok beze změny a vrátí memblock
.
Pokud je aplikace propojena s ladicí verzí knihoven runtime jazyka C, _expand
přeloží na _expand_dbg
. Další informace o správě haldy během procesu ladění naleznete v části Haldy ladění CRT.
Tato funkce ověří své parametry. Pokud memblock
je ukazatel null, tato funkce vyvolá neplatnou obslužnou rutinu parametru, jak je popsáno v ověření parametru. Pokud je povoleno pokračovat provádění, errno
je nastavena na EINVAL
a funkce vrátí NULL
. Je-li size
větší než _HEAP_MAXREQ
, errno
je nastavena na ENOMEM
, a funkce vrátí NULL
.
Ve výchozím nastavení je globální stav této funkce vymezen na aplikaci. Chcete-li toto chování změnit, přečtěte si téma Globální stav v CRT.
Požadavky
Function | Požadovaný hlavičkový soubor |
---|---|
_expand |
<malloc.h> |
Další informace o kompatibilitě najdete v tématu Kompatibilita.
Příklad
// 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