This is an old revision of the document!
W języku C można wyróżnić dwie podstawowe metody alokacji (przydzielania) pamięci:
static
), lub po zakończeniu programuint a; char str[] = "Hello!"; float tab[5];
int* tab = (int*) malloc(5 * sizeof(int)); free(tab);
Dynamiczna alokacja pamięci pozwala przede wszystkim na:
Funkcja malloc() (od memory allocation) rezerwuje blok wolnej pamięci o zadanym rozmiarze (w bajtach) i zwraca adres jego pierwszego bajtu. W przypadku nieznalezienia wymaganego obszaru malloc()
zwraca wskaźnik zerowy (dla przypomnienia – wskaźnik o wartości 0
).
Ponieważ rezerwowany blok może być zmienną dowolnego typu, funkcja ta zwraca uniwersalny “wskaźnik na void
”. Choć można go przypisać bezpośrednio do wskaźnika pożądanego typu, do dobrego tonu należy zastosowanie w tym przypadku operatora rzutowania (poprawia to czytelność).
Aby utworzyć tablicę typu double
o zadanym rozmiarze z użyciem funkcji malloc()
można napisać następujący kod:
int rozmiar = 10; double* tab = (double*) malloc(rozmiar * sizeof(double));
Powyższy kod zarezerwuje obszar pamięci dla 10 wartości typu double
i przypisze adres wskaźnikowi tab
. Zauważ, że zmienna tab
została zadeklarowana jako wskaźnik do pojedynczej wartości double
, a nie do bloku 10 takich wartości. Dlaczego? Ponieważ nazwa tablicy jest zarazem adresem jej pierwszego elementu, powyższe przypisanie umożliwia korzystanie z tab
jak ze zwykłej nazwy tablicy (np. tab[0]
to wartość jej pierwszego elementu).
Funkcja free() zwalnia pamięć przydzieloną przez malloc()
(i tylko taką). Argumentem funkcji free()
jest adres obszaru pamięci do zwolnienia.
Na przykład:
double* tab = (double*) malloc(8 * sizeof(double)); free(tab);
System operacyjny wyznacz limit pamięci, jaki może wykorzystać dany program – jego przekroczenie powoduje “ubicie” programu. Zapominając zwolnić przydzieloną pamięć można łatwo doprowadzić do wycieku pamięci i w konsekwencji właśnie do przedwczesnego zakończenia programu…