_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 errno
programu , zobaczerrno
, _doserrno
, _sys_errlist
i _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 ENOMEM
wartość , a funkcja zwraca NULL
wartość .
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