Dynamiczna alokacja pamięci w c

Dynamiczna alokacja pamięci w c

W DMA decyzja dotycząca wspomnień, które zostały przydzielone. Ta decyzja lub pamięć jest przydzielana w czasie wykonywania.

Ilekroć tworzymy dowolną zmienną poprzez DMA, ten typ zmiennych nie ma żadnej nazwy; Uzyskamy dostęp do tych zmiennych za pośrednictwem adresu lub wskaźnika.

W SMA programista wie od wcześniejszych czasów, ile zmiennych lub ile wspomnień jest wymaganych do jego programu.

Ale w DMA programista nie wie z wcześniejszego stanu, że liczba zmiennych lub pamięci jest wymaganych, zależy od wymagań użytkownika.

Rodzaje DMA:

  1. Malloc ()
  2. calloc ()
  3. realloc ()
  4. Bezpłatny ()

Malloc ()

Funkcja Malloc () to instrukcja akcji, gdy kompilator przeczytał ten wiersz. Kompilator nie rozumie, ile wspomnień jest przydzielonych, ponieważ jest to stwierdzenie akcji. W bloku pamięci wykonawczej jest tworzone.

Ilekroć nazywamy Malloc (), przekazujemy numer jako argument, który może zrozumieć liczbę bajtów bloku pamięci, które mają być tworzone przez Malloc (). W Malloc () nie może zadeklarować żadnego typu danych. Malloc () zawsze zwracaj adres, który jest tworzony blok pamięci.

Malloc () Typ powrotu jest wskaźnikiem pustki, ponieważ nie wie, które rodzaje adresu zwraca. W tym celu musimy wpisać kastę.

P = (float*) malloc (4);

Tutaj wpisujemy kastę, ponieważ Malloc () jest wskaźnikiem pustki.

Przykład 1:

#włączać
#włączać
#definicja null 0
int main ()

int *a, *t;
int rozmiar;
printf („jaki jest rozmiar stołu ? ");
Scanf („%D” i rozmiar);
printf („\ n”);
if ((t = (int *) malloc (rozmiar * sizeof (int))) == null)

printf („Brak dostępnej przestrzeni \ n”);
wyjście (1);

printf („\ n adres pierwszego bajtu to %u \ n”, t);
/* Odczytane wartości tabeli*/
printf („\ n Wartości tabeli wejściowej \ n”);
dla (a = t; a < t + size ; a++ )
Scanf („%D”, A);
/* Wartości tabeli drukowania w odwrotnej kolejności*/
dla (a = rozmiar t + - 1; a> = t; a -)
printf („ %d jest przechowywany pod adresem %u \ n”, *a, a);
darmowe (t);
powrót 0;

Wyjście:

Calloc ():

Za pomocą Calloc () możemy utworzyć więcej niż jeden blok lub tablicę w CallOC (przechodzimy dwa argumenty; pierwsza to ile bloków chcemy utworzyć, a druga to rozmiar bloku). calloc () również zwraca adres w każdym bloku według domyślnie 0 istnieje.

Przykład-2:

#włączać
#włączać
int main ()

int *n, *freq, i, rozmiar;
printf („jaki jest rozmiar listy ? ");
Scanf („%D” i rozmiar);
n = (int *) malloc (rozmiar * sizeof (int));
printf („Wprowadź liczby:”);
dla (i = 0; i < size ; i++ )

printf („\ n Wprowadź numer [%d]:", i);
Scanf („%d”, & n [i]);
if (n [i] < 0 || n [ i ] > 4)

printf („\ n Numer powinien znajdować się w zakresie (0-4)”);
I-- ;
Kontynuować ;


freq = (int *) calloc (5, sizeof (int));
dla (i = 0; i < size ; i++ )
freq [n [i]] ++;
printf („\ n częstotliwości liczb to:”);
dla (i = 0; i < 5 ; i++ )
printf ("\ n freq [ %d] = %d", i, freq [i]);
printf („\ n”);
darmowe (freq);
powrót 0;

Wyjście:

realloc ()

Ilekroć tworzymy blok za pomocą Malloc () lub calloc () i chcemy zmienić lub zmienić rozmiar bloku, używamy realLoc ().

Void *realloc (void *blok, int rozmiar)

W RealLoc () musimy przekazać adres jako argument, z którego blok chcemy zmienić rozmiar.

RealLoc (PTR, 8);

i rozmiar bloku, który chcemy zmienić rozmiar. Ten rozmiar musimy przekazać argument w RealLoc ().

podwójne *q;
Q = realloc (ptr, 8);

Tylko te bloki tworzone przez Malloc () lub calloc () mogą być zmienione przez realLoc ().

Przykład-3:

#włączać
#włączać
#włączać
#definicja null 0
int main ()

Bufor char *;
/ * Przydzielanie pamięci */
if ((bufor = (char *) malloc (10)) == null)

printf („Malloc nie powiodło się. \N " ) ;
wyjście (1);

printf („Bufor o wielkości %d utworzony \ n”, rozmiar (bufor));
Strcpy (bufor, „Hyderabad”);
printf („\ n Bufor zawiera: %s \ n”, bufor);
/ * Reallocation */
if ((buffer = (char *) realLoc (bufor, 15)) == null)
printf („Reallocation nie powiodła się. \N " ) ;
wyjście (1);

printf („\ n rozmiar bufora zmodyfikowany. \N " ) ;
printf („\ n Bufor nadal zawiera: %s \ n”, bufor);
strcpy (bufor, „secunderabad”);
printf („\ n Bufor zawiera teraz: %s \ n”, bufor);
/ * Uwolnienie pamięci */
darmowy (bufor);
powrót 0;

Wyjście:

bezpłatny ()

Za pomocą Free () uwalniamy blok pamięci, który jest tworzony przez Malloc () lub calloc () lub realLoc ().

Zmienne statyczne istnieją tylko w zakresie bloku lub funkcji. Jeśli nie możemy uruchomić free (), ilekroć zmienna statyczna p zostaje zniszczona, zmienna, która jest tworzona dynamicznie, która nie jest zniszczona, ale pozostała na zawsze w pamięci lub pamięci. To nazywa się wyciekiem pamięci. W przypadku tego darmowego () jest wymagane do zniszczenia bloku pamięci, który jest tworzony dynamicznie.

Free () niszczą tylko te pamięć, która jest tworzona dynamicznie.

Wniosek:

DMA jest potężną koncepcją w języku C, ponieważ usuwa wadę SMA. W SMA musimy podjąć decyzję przed uruchomieniem programu, że liczba bloków pamięci jest tworzonych. W rezultacie pamięć jest zmarnowana lub pamięć nie wystarczy. DMA rozwiązuje problem, podejmując decyzję w czasie wykonywania, ile bloków jest wymaganych do przydzielenia pamięci. Przydziela pamięć do wymogu programu.