C Dynamiczne przydzielanie pamięci przy użyciu malloc (), calloc (), free () i realloc ()

W tym samouczku nauczysz się dynamicznego przydzielania pamięci w programie w języku C przy użyciu standardowych funkcji bibliotecznych: malloc (), calloc (), free () i realloc ().

Jak wiesz, tablica to zbiór ustalonej liczby wartości. Po zadeklarowaniu rozmiaru tablicy nie można jej zmienić.

Czasami rozmiar zadeklarowanej tablicy może być niewystarczający. Aby rozwiązać ten problem, możesz przydzielić pamięć ręcznie w czasie wykonywania. Jest to znane jako dynamiczna alokacja pamięci w programowaniu w C.

Przydzielić dynamicznie pamięci, funkcje biblioteczne są malloc(), calloc(), realloc()i free()są stosowane. Te funkcje są zdefiniowane w pliku nagłówkowym.

C malloc ()

Nazwa „malloc” oznacza alokację pamięci.

malloc()Funkcja zastrzega blok pamięci określonej liczby bajtów. I zwraca wskaźnik, voidktóry można rzutować na wskaźniki dowolnej postaci.

Składnia malloc ()

 ptr = (castType*) malloc(size);

Przykład

 ptr = (float*) malloc(100 * sizeof(float));

Powyższa instrukcja przydziela 400 bajtów pamięci. To dlatego, że rozmiar floatwynosi 4 bajty. Wskaźnik ptr przechowuje adres pierwszego bajtu w przydzielonej pamięci.

Wyrażenie powoduje wyświetlenie NULLwskaźnika, jeśli nie można przydzielić pamięci.

C calloc ()

Nazwa „calloc” oznacza ciągłą alokację.

malloc()Przydziela pamięć funkcyjne i liście pamięć niezainicjowanymi. Natomiast calloc()funkcja alokuje pamięć i inicjalizuje wszystkie bity do zera.

Składnia calloc ()

 ptr = (castType*)calloc(n, size);

Przykład:

 ptr = (float*) calloc(25, sizeof(float));

Powyższa instrukcja przydziela ciągłą przestrzeń w pamięci na 25 elementów typu float.

C wolny ()

Pamięć przydzielana dynamicznie, utworzona za pomocą jednego z nich calloc()lub malloc()nie jest zwalniana samodzielnie. Musisz wyraźnie użyć, free()aby zwolnić miejsce.

Składnia free ()

 free(ptr);

Ta instrukcja zwalnia miejsce przydzielone w pamięci wskazywanej przez ptr.

Przykład 1: malloc () i free ()

 // Program to calculate the sum of n numbers entered by the user #include #include int main() ( int n, i, *ptr, sum = 0; printf("Enter number of elements: "); scanf("%d", &n); ptr = (int*) malloc(n * sizeof(int)); // if memory cannot be allocated if(ptr == NULL) ( printf("Error! memory not allocated."); exit(0); ) printf("Enter elements: "); for(i = 0; i < n; ++i) ( scanf("%d", ptr + i); sum += *(ptr + i); ) printf("Sum = %d", sum); // deallocating the memory free(ptr); return 0; ) 

Tutaj dynamicznie przydzieliliśmy pamięć dla n liczby int.

Przykład 2: calloc () i free ()

 // Program to calculate the sum of n numbers entered by the user #include #include int main() ( int n, i, *ptr, sum = 0; printf("Enter number of elements: "); scanf("%d", &n); ptr = (int*) calloc(n, sizeof(int)); if(ptr == NULL) ( printf("Error! memory not allocated."); exit(0); ) printf("Enter elements: "); for(i = 0; i < n; ++i) ( scanf("%d", ptr + i); sum += *(ptr + i); ) printf("Sum = %d", sum); free(ptr); return 0; ) 

C realloc ()

Jeśli pamięć przydzielana dynamicznie jest niewystarczająca lub większa niż wymagana, możesz zmienić rozmiar wcześniej przydzielonej pamięci za pomocą realloc()funkcji.

Składnia realloc ()

 ptr = realloc(ptr, x);

Tutaj ptr jest ponownie przydzielany z nowym rozmiarem x.

Przykład 3: realloc ()

 #include #include int main() ( int *ptr, i , n1, n2; printf("Enter size: "); scanf("%d", &n1); ptr = (int*) malloc(n1 * sizeof(int)); printf("Addresses of previously allocated memory: "); for(i = 0; i < n1; ++i) printf("%u",ptr + i); printf("Enter the new size: "); scanf("%d", &n2); // rellocating the memory ptr = realloc(ptr, n2 * sizeof(int)); printf("Addresses of newly allocated memory: "); for(i = 0; i < n2; ++i) printf("%u", ptr + i); free(ptr); return 0; )

Po uruchomieniu programu wynik będzie następujący:

 Wprowadź rozmiar: 2 Adresy poprzednio przydzielonej pamięci: 26855472 26855476 Wprowadź nowy rozmiar: 4 Adresy nowo przydzielonej pamięci: 26855472 26855476 26855480 26855484

Interesujące artykuły...