Realloc

ceer
void *realloc(void *p, size_t size);
<justify>Funkcja zmienia rozmiar obiektu wskazanego przez wskaźnik p na wartość określoną przez size. Cała istota działania funkcji realloc polega na tym, że najpierw znajduje ona miejsce na nowy obszar pamięci, następnie kolejno kopiuje dane oryginalne w nowe miejsce, zwalnia stary obszar pamięci oraz zwraca wskaźnik do nowego obszaru. Niepowodzenie realokacji sygnalizowane jest poprzez zwrócenie wartości NULL.</justify> Może się zdarzyć, że zwrócony zostanie ten sam wskaźnik, który został podany jako argument i nie należy tego traktować jako błąd.

<font color="darkred">Błędem natomiast jest realokacja miejsca w poniższy sposób:</span>

int main (int argc, char* argv[])
{
  int *p;
 
  p = malloc(10 * sizeof(int));  /* alokacja miejsca pod 10 elementów typu int */
 
  /* ... */
 
  p = realloc(p, 20 * sizeof(int));  /* realokacja miejsca na 10 elementów typu int więcej */
 
   /* ... */
 
 free(p);  /* zwolnienie obszaru wskazywanego przez p */
}

Uwagę należy zwrócić na to, że przy niepowodzeniu realokacji, pod wskaźnik p zostanie podstawiona wartość NULL, co skutkuje utratę poprzedniej wartości p oraz przede wszystkim tzw. Wyciek pamięci.

<font color="darkgreen">Oto, jak należy poprawnie przeprowadzić wspomnianą realokację pamięci:</span>

int main (int argc, char* argv[])
{
  int *p;
  void *tmp;  /* tymczasowy wskaźnik typu void */
 
  p = malloc(10 * sizeof(int));  /* alokacja miejsca pod 10 elementów typu int */
 
  /* ... */
 
  if( (tmp = realloc(p, 20 * sizeof(int))) == NULL )
  {
    /* odpowiednie działania w przypadku błędu realokacji */
  }
  else
  {
    p = tmp;
  }
 
   /* ... */
 
 free(p);  /* zwolnienie obszaru wskazywanego przez p */
}
Warto zauważyć pewną własność funkcji realloc: ```c realloc(NULL, n) ≡ malloc(n); realloc(p, 0) ≡ free(p); ``` Powyższe zależności mogą być wykorzystane przy używaniu realloc w pętli w celu budowy dynamicznej struktury takiej jak lista z dowiązaniami.

Zobacz też:

1 komentarz

Bardzo pomocne dzięki! ;)