czwartek, 26 kwietnia 2018

Język C - Zarządzanie pamięcią


C - Zarządzanie pamięcią

W tym rozdziale wyjaśniono zarządzanie pamięcią dynamiczną w C. Język programowania C zapewnia kilka funkcji przydzielania i zarządzania pamięcią. Te funkcje można znaleźć w pliku nagłówkowym <stdlib.h>.
L.p.
Opis funkcji
1
void * calloc (int liczba, int wielkość);
Funkcja przydziela tablicę num elementów, których rozmiar w bajtach równa się wielkość.
2
void free (void * address);
Ta funkcja zwalnia blok pamięci określony przez adres.
3
void * malloc (int num);
Ta funkcja alokuje tablicę num bajtów i zostawia ją niezainicjowaną.
4
void * realloc (void * address, int newsize);
Ta funkcja ponownie przydziela pamięć rozszerzając ją do newsize.

Dynamiczne przydzielanie pamięci

Podczas programowania, jeśli wiesz o wielkości tablicy, to jest to łatwe i możesz zdefiniować je jako tablicę. Na przykład, aby zapisać nazwisko dowolnej osoby, może ono mieć maksymalnie 100 znaków, więc możesz zdefiniować ją w następujący sposób:
char nazwa[100];
Ale teraz zastanówmy się nad sytuacją, w której nie masz pojęcia o długości tekstu, który chcesz przechowywać, na przykład chcesz zapisać szczegółowy opis tematu. Tutaj musimy zdefiniować wskaźnik do znaku bez określania, ile pamięci jest wymagane, a później, w zależności od wymagań, możemy przydzielić pamięć, jak pokazano w poniższym przykładzie:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {

   char nazwa[100];
   char *opis;

   strcpy(nazwa, "Ali Baba");

   /* dynamicznie przydzielanie pamięci */
   opis = malloc( 200 * sizeof(char) );
       
   if( opis == NULL ) {
      fprintf(stderr, " Błąd - nie można przydzielić wymaganej pamięci\n");
   } else {
      strcpy( opis, "Ali Baba bohater baśni");
   }
  
   printf("Nazwa = %s\n", nazwa );
   printf("Opis: %s\n", opis );
}
Gdy powyższy kod zostanie skompilowany i wykonany, wygeneruje się następujący wynik.
Nazwa = Ali Baba
Opis: Ali Baba bohater baśni
Ten sam program można zapisać za pomocą metody calloc(); jedyną rzeczą, którą musisz zrobić to zastąpić malloc słowem calloc, jak poniżej:
calloc(200, sizeof(char));
Dzięki temu masz pełną kontrolę i możesz przekazać dowolną wartość wielkości podczas przydzielania pamięci, w przeciwieństwie do tablic, gdzie po zdefiniowaniu rozmiaru nie możesz go zmienić.

Zmiana rozmiaru i zwalnianie pamięci

Po wyjściu programu system operacyjny automatycznie zwolni całą pamięć przydzieloną przez program, ale jako dobrą praktykę, gdy nie potrzebujesz więcej pamięci, powinieneś zwolnić tę pamięć, wywołując funkcję free().
Alternatywnie można zwiększyć lub zmniejszyć rozmiar przydzielonego bloku pamięci, wywołując funkcję realloc(). Pozwól nam ponownie sprawdzić poniższy program i skorzystaj z funkcji realloc() i free():
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {

   char nazwa[100];
   char *opis;

   strcpy(nazwa, "Ali Baba");

   /* dynamicznie przydzielanie pamięci */
   opis = malloc( 30 * sizeof(char) );
       
   if( opis == NULL ) {
      fprintf(stderr, " Błąd - nie można przydzielić wymaganej pamięci\n");
   } else {
      strcpy( description, "Ali Baba bohater baśni.");
   }
       
   /* przypuśćmy, że chcesz przechowywać większy opis */
   opis = realloc( opis, 100 * sizeof(char) );
       
   if( opis == NULL ) {
      fprintf(stderr, " Błąd - nie można przydzielić wymaganej pamięci\n");
   } else {
      strcat( opis, " Bohater baśni ze zbioru Tysiąca i jednej nocy.");
   }
  
   printf("Nazwa = %s\n", nazwa );
   printf("Opis: %s\n", opis );

   /* zwolnij pamięć za pomocą funkcji free () */
   free(opis);
}
Gdy powyższy kod zostanie skompilowany i wykonany, wygeneruje się następujący wynik.
Nazwa = Ali Baba
Opis: Ali Baba bohater baśni. Bohater baśni ze zbioru Tysiąca i jednej nocy.
Możesz wypróbować powyższy przykład bez ponownej alokacji dodatkowej pamięci, a funkcja strcat() spowoduje błąd z powodu braku dostępnej pamięci w opisie.

Poprzednia strona                                                          Następna strona

Brak komentarzy:

Prześlij komentarz