User Tools

Site Tools


dydaktyka:cprog:2015:dynamic_memory_allocation

This is an old revision of the document!


Dynamiczna alokacja pamięci

W języku C można wyróżnić dwie podstawowe metody alokacji (przydzielania) pamięci:

  • alokacja statyczna – ilość pamięci zostaje z góry określona na etapie pisania programu (poprzez odpowiednie deklaracje zmiennych); pamięć jest zwalniana automatycznie – po zakończeniu bloku programu, w którym była deklarowana (chyba, że obiekt został zadeklarowany jako static), lub po zakończeniu programu
    int a;
    char str[] = "Hello!";
    float tab[5];
  • alokacja dynamiczna – program przydziela dowolne ilości pamięci w trakcie pracy, poprzez wywołanie odpowiednich funkcji; pamięć musi być jawnie zwolniona (z użyciem odpowiedniej funkcji)
    int* tab = (int*) malloc(5 * sizeof(int));
    free(tab);

Dynamiczna alokacja pamięci pozwala przede wszystkim na:

  • utworzenie tablicy o rozmiarze obliczanym dopiero podczas działania programu
  • dostęp do zmiennych utworzonych wewnątrz funkcji po wyjściu z nich

Funkcja "malloc"

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 n = 10;
double* tab = (double*) malloc(n * 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).

dydaktyka/cprog/2015/dynamic_memory_allocation.1447621473.txt.gz · Last modified: 2020/03/25 11:46 (external edit)