Sdílet prostřednictvím


_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í NULLfunkce . _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

Viz také

Přidělení paměti
calloc
free
malloc
_msize
realloc