Dinamičko dodjeljivanje memorije u C: funkcije malloc (), calloc ()

Sadržaj:

Anonim

Prije nego što naučite dodjelu dinamičke memorije C, shvatimo:

Kako funkcionira upravljanje memorijom u C-u?

Kada deklarirate varijablu koristeći osnovni tip podataka, C kompajler automatski dodjeljuje memorijski prostor za varijablu u spremištu memorije nazvanom stog .

Na primjer, varijabla float uzima obično 4 bajta (prema platformi) kad je deklarirana. Te podatke možemo provjeriti pomoću operatora sizeof kao što je prikazano u donjem primjeru

#include int main() { float x; printf("The size of float is %d bytes", sizeof(x)); return 0;}

Izlaz će biti:

 The size of float is 4 bytes 

Također, niz s navedenom veličinom dodjeljuje se u susjedne blokove memorije, svaki blok ima veličinu za jedan element:

#include int main() { float arr[10];printf("The size of the float array with 10 element is %d", sizeof(arr)); return 0;} 

Rezultat je:

 The size of the float array with 10 element is 40

Kao što smo do sada naučili, prilikom deklariranja osnovnog tipa podataka ili niza, memorijom se automatski upravlja. Međutim, postoji postupak za dodjelu memorije u jeziku C koji će vam omogućiti da implementirate program u kojem veličina polja nije odlučena dok ne pokrenete svoj program (runtime). Taj se postupak naziva " Dinamičko dodjeljivanje memorije ".

U ovom vodiču naučit ćete-

  • Kako funkcionira upravljanje memorijom u C-u?
  • Dinamička dodjela memorije u C
  • Funkcija C malloc ()
  • Besplatna () funkcija
  • C calloc () funkcija
  • calloc () nasuprot malloc (): Ključne razlike
  • C realloc () funkcija
  • Dinamički nizovi

Dinamička dodjela memorije u C

Dinamičko raspoređivanje memorije ručno je raspoređivanje i oslobađanje memorije u skladu s vašim programskim potrebama. Dinamičkom memorijom upravljaju se i poslužuju pokazivači koji upućuju na novo dodijeljeni memorijski prostor u području koje nazivamo hrpom.

Sada možete bez problema stvoriti i uništiti niz elemenata dinamički tijekom izvođenja. Da sumiramo, automatsko upravljanje memorijom koristi stog, a C Dynamic Memory Allocation koristi hrpu.

Biblioteka ima funkcije odgovorne za dinamičko upravljanje memorijom.

Funkcija Svrha
malloc () Dodjeljuje memoriju tražene veličine i vraća pokazivač na prvi bajt dodijeljenog prostora.
kalok () Dodjeljuje prostor za elemente niza. Inicijalizira elemente na nulu i vraća pokazivač u memoriju.
realloc () Koristi se za izmjenu veličine prethodno dodijeljenog memorijskog prostora.
Besplatno() Oslobađa ili prazni prethodno dodijeljeni memorijski prostor.

Razmotrimo gornje funkcije s njihovom primjenom

Funkcija C malloc ()

Funkcija C malloc () označava dodjelu memorije. To je funkcija koja se koristi za dinamičko dodjeljivanje bloka memorije. Rezervira memorijski prostor određene veličine i vraća null pokazivač koji pokazuje na memorijsko mjesto. Vraćeni pokazivač obično je tipa void. To znači da bilo kojem pokazivaču možemo dodijeliti funkciju C malloc ().

Sintaksa funkcije malloc ():

ptr = (cast_type *) malloc (byte_size);

Ovdje,

  • ptr je pokazivač na cast_type.
  • Funkcija C malloc () vraća pokazivač na dodijeljenu memoriju byte_size.

Primjer malloc ():

Example: ptr = (int *) malloc (50)

Kada se ovaj izraz uspješno izvrši, rezerviran je memorijski prostor od 50 bajtova. Adresa prvog bajta rezerviranog prostora dodjeljuje se pokazivaču ptr tipa int.

Razmotrimo još jedan primjer:

#include int main(){int *ptr;ptr = malloc(15 * sizeof(*ptr)); /* a block of 15 integers */if (ptr != NULL) {*(ptr + 5) = 480; /* assign 480 to sixth integer */printf("Value of the 6th integer is %d",*(ptr + 5));}}

Izlaz:

Value of the 6th integer is 480

  1. Primijetite da je sizeof (* ptr) korišten umjesto sizeof (int) kako bi se kôd učinio robusnijim kad se * ptr deklaracija kasnije unese u drugu vrstu podataka.
  2. Dodjela može propasti ako memorija nije dovoljna. U ovom slučaju, vraća NULL pokazivač. Dakle, trebali biste uključiti kod za provjeru NULL pokazivača.
  3. Imajte na umu da je dodijeljena memorija susjedna i može se tretirati kao niz. Za pristup elementima niza možemo koristiti aritmetiku pokazivača umjesto da koristimo zagrade []. Savjetujemo da koristite + za pozivanje na elemente niza jer upotreba povećanja ++ ili + = mijenja adresu pohranjenu pokazivačem.

Funkcija Malloc () također se može koristiti s tipom podataka o znakovima, kao i složenim vrstama podataka kao što su strukture.

Besplatna () funkcija

Memorija za varijable automatski se oslobađa u vrijeme sastavljanja. U dinamičkoj dodjeli memorije morate izričito osloboditi memoriju. Ako to nije učinjeno, možete naići na pogrešku u memoriji.

Funkcija free () poziva se za oslobađanje / oslobađanje memorije u C. Oslobađanjem memorije u programu, učinite dostupnijim za kasnije korištenje.

Na primjer:

#include int main() {int* ptr = malloc(10 * sizeof(*ptr));if (ptr != NULL){*(ptr + 2) = 50;printf("Value of the 2nd integer is %d",*(ptr + 2));}free(ptr);}

Izlaz

 Value of the 2nd integer is 50

C calloc () funkcija

Funkcija C calloc () označava susjednu alokaciju. Ova se funkcija koristi za dodjelu više blokova memorije. To je funkcija dinamičke dodjele memorije koja se koristi za dodjelu memorije složenim strukturama podataka kao što su nizovi i strukture.

Funkcija Malloc () koristi se za dodjelu jednog bloka memorijskog prostora, dok se calloc () u C koristi za dodjelu više blokova memorijskog prostora. Svaki blok dodijeljen funkcijom calloc () iste je veličine.

Sintaksa funkcije calloc ():

ptr = (cast_type *) calloc (n, size);
  • Gornja izjava koristi se za dodjelu n memorijskih blokova iste veličine.
  • Nakon dodjele memorijskog prostora, svi se bajtovi inicijaliziraju na nulu.
  • Vraćen je pokazivač koji je trenutno u prvom bajtu dodijeljenog prostora memorije.

Kad god dođe do pogreške pri dodjeli memorijskog prostora, poput nedostatka memorije, vraća se null pokazivač.

Primjer calloc ():

Program u nastavku izračunava zbroj aritmetičkog niza.

#include int main() {int i, * ptr, sum = 0;ptr = calloc(10, sizeof(int));if (ptr == NULL) {printf("Error! memory not allocated.");exit(0);}printf("Building and calculating the sequence sum of the first 10 terms \ n ");for (i = 0; i < 10; ++i) { * (ptr + i) = i;sum += * (ptr + i);}printf("Sum = %d", sum);free(ptr);return 0;}

Proizlaziti:

Building and calculating the sequence sum of the first 10 termsSum = 45

calloc () nasuprot malloc (): Ključne razlike

Slijedi ključna razlika između malloc () Vs calloc () u C:

Funkcija calloc () općenito je prikladnija i učinkovitija od funkcije malloc (). Iako se obje funkcije koriste za dodjelu memorijskog prostora, calloc () može dodijeliti više blokova odjednom. Ne morate svaki put zatražiti memorijski blok. Funkcija calloc () koristi se u složenim podatkovnim strukturama koje zahtijevaju veći memorijski prostor.

Memorijski blok koji je dodijelio calloc () u C uvijek se inicijalizira na nulu, dok u funkciji malloc () u C uvijek sadrži vrijednost smeća.

C realloc () funkcija

Pomoću funkcije C realloc () možete dodati veću veličinu memorije u već dodijeljenu memoriju. Proširuje trenutni blok, a izvorni sadržaj ostaje takav kakav jest. realloc () u C označava preraspodjelu memorije.

realloc () se također može koristiti za smanjenje veličine prethodno dodijeljene memorije.

Sintaksa funkcije realloc ():

ptr = realloc (ptr,newsize);

Gornja izjava dodjeljuje novi memorijski prostor određene veličine u varijabli newsize. Nakon izvršavanja funkcije, pokazivač će se vratiti na prvi bajt memorijskog bloka. Nova veličina može biti veća ili manja od prethodne memorije. Ne možemo biti sigurni hoće li novo dodijeljeni blok ukazivati ​​na isto mjesto kao i prethodni memorijski blok. Ova će funkcija kopirati sve prethodne podatke u novoj regiji. Osigurava da podaci ostanu sigurni.

Primjer realloc ():

#include int main () {char *ptr;ptr = (char *) malloc(10);strcpy(ptr, "Programming");printf(" %s, Address = %u\n", ptr, ptr);ptr = (char *) realloc(ptr, 20); //ptr is reallocated with new sizestrcat(ptr, " In 'C'");printf(" %s, Address = %u\n", ptr, ptr);free(ptr);return 0;} 

Kad god realloc () u C rezultira neuspješnom operacijom, vraća null pokazivač, a oslobađaju se i prethodni podaci.

Dinamički nizovi u C

Dinamički niz u C omogućuje rast broja elemenata po potrebi. C Dinamički niz naširoko se koristi u algoritmima informatike.

U sljedećem programu stvorili smo i promijenili veličinu dinamičkog niza u C-u

#include int main() {int * arr_dynamic = NULL;int elements = 2, i;arr_dynamic = calloc(elements, sizeof(int)); //Array with 2 integer blocksfor (i = 0; i < elements; i++) arr_dynamic[i] = i;for (i = 0; i < elements; i++) printf("arr_dynamic[%d]=%d\n", i, arr_dynamic[i]);elements = 4;arr_dynamic = realloc(arr_dynamic, elements * sizeof(int)); //reallocate 4 elementsprintf("After realloc\n");for (i = 2; i < elements; i++) arr_dynamic[i] = i;for (i = 0; i < elements; i++) printf("arr_dynamic[%d]=%d\n", i, arr_dynamic[i]);free(arr_dynamic);} 

Rezultat programa C Dynamic array na ekranu:

arr_dynamic[0]=0arr_dynamic[1]=1After reallocarr_dynamic[0]=0arr_dynamic[1]=1arr_dynamic[2]=2arr_dynamic[3]=3

Sažetak

  • Memorijom možemo dinamički upravljati stvaranjem memorijskih blokova prema potrebi u hrpi
  • U C Dynamic Memory Allocation memorija se dodjeljuje u vrijeme izvođenja.
  • Dinamičko dodjeljivanje memorije omogućuje manipulaciju nizovima i nizovima čija je veličina fleksibilna i može se mijenjati bilo kada u vašem programu.
  • Potrebno je kad nemate pojma koliko će memorije zauzeti određena struktura.
  • Malloc () u jeziku C funkcija je dinamičke dodjele memorije koja označava dodjelu memorije koja blokira memoriju određene veličine inicijaliziranu u vrijednost smeća
  • Calloc () u C je susjedna funkcija raspodjele memorije koja dodjeljuje više memorijskih blokova istovremeno inicijaliziranih na 0
  • Realloc () u C koristi se za preraspodjelu memorije prema navedenoj veličini.
  • Funkcija Free () koristi se za brisanje dinamički dodijeljene memorije.