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:

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


Zobacz też:

1 komentarz

Bardzo pomocne dzięki! ;)