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ż:
Bardzo pomocne dzięki! ;)