realloc
Przydziel bloki pamięci.
Składnia
void *realloc(
void *memblock,
size_t size
);
Parametry
memblock
Wskaźnik do wcześniej przydzielonego bloku pamięci.
size
Nowy rozmiar w bajtach.
Wartość zwracana
realloc
void
Zwraca wskaźnik do przydzielonego (i prawdopodobnie przeniesionego) bloku pamięci.
Jeśli nie ma wystarczającej ilości dostępnej pamięci, aby rozwinąć blok do danego rozmiaru, oryginalny blok pozostanie niezmieniony i NULL
zostanie zwrócony.
Jeśli size
ma wartość zero, blok wskazywany przez memblock
element jest zwalniany; zwracana wartość to NULL
, i memblock
jest w lewo wskazująca na wolny blok.
Wartość zwracana wskazuje miejsce do magazynowania, które jest odpowiednio wyrównane do magazynu dowolnego typu obiektu. Aby uzyskać wskaźnik do typu innego niż void
, użyj rzutowania typu na wartość zwracaną.
Uwagi
Uwaga
realloc
nie został zaktualizowany w celu zaimplementowania zachowania C17, ponieważ nowe zachowanie nie jest zgodne z systemem operacyjnym Windows.
Funkcja realloc
zmienia rozmiar przydzielonego bloku pamięci. Argument memblock
wskazuje początek bloku pamięci. Jeśli memblock
parametr ma NULL
wartość , realloc
zachowuje się tak samo jak malloc
i przydziela nowy blok bajtów size
. Jeśli memblock
nie NULL
jest , powinien to być wskaźnik zwrócony przez poprzednie wywołanie metody calloc
, malloc
lub realloc
.
Argument size
daje nowy rozmiar bloku w bajtach. Zawartość bloku pozostaje niezmieniona do krótszego od nowych i starych rozmiarów, chociaż nowy blok może znajdować się w innej lokalizacji. Ponieważ nowy blok może znajdować się w nowej lokalizacji pamięci, wskaźnik zwrócony przez realloc
element nie ma gwarancji, że wskaźnik jest przekazywany przez memblock
argument. realloc
w przypadku wzrostu buforu nie ma wartości zerowej nowo przydzielonej pamięci.
realloc
ustawia wartość errno
, ENOMEM
jeśli alokacja pamięci nie powiedzie się lub jeśli żądana ilość pamięci przekracza _HEAP_MAXREQ
wartość . Aby uzyskać informacje na temat tego i innych kodów błędów, zobacz errno
, _doserrno
, _sys_errlist
i _sys_nerr
.
realloc
wywołania malloc
w celu ustawienia nowego trybu obsługi za pomocą funkcji języka C++ _set_new_mode
. Nowy tryb obsługi wskazuje, malloc
czy w przypadku niepowodzenia należy wywołać nową procedurę obsługi zgodnie z ustawieniem ._set_new_handler
Domyślnie malloc
nie wywołuje nowej procedury obsługi w przypadku niepowodzenia przydzielenia pamięci. To domyślne zachowanie można zastąpić, aby w przypadku realloc
niepowodzenia przydzielenia pamięci malloc
wywołać nową procedurę obsługi w taki sam sposób, jak new
operator, gdy ulegnie awarii z tego samego powodu. Aby zastąpić wartość domyślną, wywołaj metodę
_set_new_mode(1);
na początku programu lub połączenia z NEWMODE. OBJ (zobacz Opcje łącza).
Gdy aplikacja jest połączona z wersją debugowania bibliotek czasu wykonywania języka C, realloc
jest rozpoznawana jako _realloc_dbg
. Aby uzyskać więcej informacji o sposobie zarządzania stertą podczas procesu debugowania, zobacz Sterta debugowania CRT.
realloc
jest oznaczony __declspec(noalias)
i __declspec(restrict)
, co oznacza, że funkcja nie ma gwarancji, aby nie modyfikować zmiennych globalnych i że zwrócony wskaźnik nie jest aliasowany. Aby uzyskać więcej informacji, zobacz tematy noalias
oraz restrict
.
Domyślnie stan globalny tej funkcji jest zakresem aplikacji. Aby zmienić to zachowanie, zobacz Stan globalny w CRT.
Wymagania
Procedura | Wymagany nagłówek |
---|---|
realloc |
<stdlib.h> i <malloc.h> |
Aby uzyskać więcej informacji o zgodności, zobacz Zgodność.
Przykład
// crt_realloc.c
// This program allocates a block of memory for
// buffer and then uses _msize to display the size of that
// block. Next, it uses realloc to expand the amount of
// memory used by buffer and then calls _msize again to
// display the new amount of memory allocated to buffer.
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
int main( void )
{
long *buffer, *oldbuffer;
size_t size;
if( (buffer = (long *)malloc( 1000 * sizeof( long ) )) == NULL )
exit( 1 );
size = _msize( buffer );
printf_s( "Size of block after malloc of 1000 longs: %u\n", size );
// Reallocate and show new size:
oldbuffer = buffer; // save pointer in case realloc fails
if( (buffer = realloc( buffer, size + (1000 * sizeof( long )) ))
== NULL )
{
free( oldbuffer ); // free original block
exit( 1 );
}
size = _msize( buffer );
printf_s( "Size of block after realloc of 1000 more longs: %u\n",
size );
free( buffer );
exit( 0 );
}
Size of block after malloc of 1000 longs: 4000
Size of block after realloc of 1000 more longs: 8000