Udostępnij za pośrednictwem


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

reallocvoid 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 NULLwartość , realloc zachowuje się tak samo jak malloc i przydziela nowy blok bajtów size . Jeśli memblock nie NULLjest , powinien to być wskaźnik zwrócony przez poprzednie wywołanie metody calloc, malloclub 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_MAXREQwartość . Aby uzyskać informacje na temat tego i innych kodów błędów, zobacz errno, _doserrno, _sys_errlisti _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

Zobacz też

Alokacja pamięci
calloc
free
malloc