Realloc
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.
Błędem natomiast jest realokacja miejsca w poniższy sposób:
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.
Oto, jak należy poprawnie przeprowadzić wspomnianą realokację pamięci:
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.
Zobacz też: