Udostępnij za pośrednictwem


_expand

Zmienia rozmiar bloku pamięci.

Składnia

void *_expand(
   void *memblock,
   size_t size
);

Parametry

memblock
Wskaźnik do wcześniej przydzielonego bloku pamięci.

size
Nowy rozmiar w bajtach.

Wartość zwracana

_expand Zwraca wskaźnik void do ponownie przydzielonego bloku pamięci. _expand, w przeciwieństwie do realloc, nie może przenieść bloku, aby zmienić jego rozmiar. W związku z tym, jeśli dostępna jest wystarczająca ilość pamięci, aby rozwinąć blok bez przenoszenia go, memblock parametr to _expand jest taki sam jak wartość zwracana.

_expand zwraca NULL błąd, gdy podczas jego operacji zostanie wykryty błąd. Jeśli na przykład _expand jest używany do zmniejszania bloku pamięci, może wykryć uszkodzenie małego sterta bloku lub nieprawidłowego wskaźnika bloku i zwrócić wartość NULL.

Jeśli nie ma wystarczającej ilości pamięci, aby rozwinąć blok bez jego przenoszenia, funkcja zwraca wartość NULL. _expand nigdy nie zwraca bloku rozwiniętego do rozmiaru mniejszego niż żądany. Jeśli wystąpi awaria, errno wskazuje charakter błędu. Aby uzyskać więcej informacji na temat errnoprogramu , zobaczerrno , _doserrno, _sys_errlisti _sys_nerr.

Wartość zwracana wskazuje miejsce do magazynowania, które jest odpowiednio wyrównane do magazynu dowolnego typu obiektu. Aby sprawdzić nowy rozmiar elementu, użyj polecenia _msize. Aby uzyskać wskaźnik do typu innego niż void, użyj rzutowania typu na wartość zwracaną.

Uwagi

Funkcja _expand zmienia rozmiar wcześniej przydzielonego bloku pamięci, próbując rozwinąć lub zakontraktować blok bez przenoszenia jego lokalizacji na stercie. Parametr memblock wskazuje początek bloku. Parametr size podaje nowy rozmiar bloku w bajtach. Zawartość bloku pozostaje niezmieniona do krótszego rozmiaru nowych i starych. memblock nie powinien być blokiem, który został uwolniony.

Uwaga

Na platformach _expand 64-bitowych blok może nie być kontraktowany, jeśli nowy rozmiar jest mniejszy niż bieżący rozmiar; w szczególności, jeśli blok był mniejszy niż 16K rozmiaru i dlatego przydzielony w stercie o niskiej fragmentacji, _expand pozostawia blok bez zmian i zwraca wartość memblock.

Gdy aplikacja jest połączona z wersją debugowania bibliotek czasu wykonywania języka C, _expand jest rozpoznawana jako _expand_dbg. Aby uzyskać więcej informacji o sposobie zarządzania stertą podczas procesu debugowania, zobacz Sterta debugowania CRT.

Ta funkcja weryfikuje jego parametry. Jeśli memblock jest wskaźnikiem o wartości null, ta funkcja wywołuje nieprawidłową procedurę obsługi parametrów zgodnie z opisem w temacie Weryfikacja parametrów. Jeśli wykonywanie jest dozwolone do kontynuowania, jest ustawione na EINVAL , errno a funkcja zwraca wartość NULL. Jeśli size wartość jest większa niż _HEAP_MAXREQ, errno jest ustawiona na ENOMEMwartość , a funkcja zwraca NULLwartość .

Domyślnie stan globalny tej funkcji jest zakresem aplikacji. Aby zmienić to zachowanie, zobacz Stan globalny w CRT.

Wymagania

Function Wymagany nagłówek
_expand <malloc.h>

Aby uzyskać więcej informacji o zgodności, zobacz Zgodność.

Przykład

// 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

Zobacz też

Alokacja pamięci
calloc
free
malloc
_msize
realloc