Recomandat, 2024

Alegerea Editorului

Diferența dintre malloc și calloc

Diferența fundamentală dintre funcția malloc și calloc este aceea că calloc () are nevoie de două argumente în locul unui argument care este cerut de malloc () . Atât malloc (), cât și calloc () sunt funcțiile pe care limbajul de programare C le oferă pentru alocarea dinamică a memoriei și pentru dezabonare la momentul executării.

Înainte de a înțelege mai întâi funcțiile malloc () și calloc (), să înțelegem semnificația alocării dinamice a memoriei. Alocarea memoriei este procedura de alocare a memoriei calculatorului pentru executarea programelor și a proceselor. Utilizăm tehnici de alocare dinamică atunci când nu este cunoscut anterior cât spațiu de memorie este necesar pentru program și proces.

Alocarea dinamică a memoriei apare din cauza problemelor asociate cu alocarea memoriei statice, cum ar fi dacă sunt stocate mai puține elemente, iar restul memoriei este irosit inutil. Prin urmare, aceasta depășește problemele de alocare a memoriei statice în cazul în care memoria este alocată numai atunci când este necesară.

Diagramă de comparație

Bazele comparațieimalloc ()calloc ()
Numărul blocurilorAlocă blocul unic de memorie cerută.
Alocă mai multe blocuri din memoria solicitată.
Sintaxăvoid * malloc (dimensiunea size_t);void * calloc (size_t num, size_t size);
Inițializareamalloc () nu clarifică și nu inițializează memoria alocată.Memoria alocată este inițializată la zero folosind calloc ().
Modul de alocareFuncția malloc () alocă memoria dimensiunii "mărimea" din heap.funcția calloc () alocă memoria a cărei mărime este egală cu dimensiunea num *.
VitezăRapidComparativ lent.

Definiția malloc ()

Funcția malloc atribuie un bloc de memorie în octeți . Utilizatorul trebuie să dea în mod explicit dimensiunea blocului, pe care o cere pentru utilizare.

Prin intermediul programului de funcții malloc se solicită RAM a sistemului de alocare a memoriei, dacă cererea este admisă (adică, funcția malloc spune că a reușit să aloce memoria), returnează un indicator la primul bloc de memorie. Returnează tipul de pointer gol, adică orice tip de pointer poate fi atribuit.

Deși, returnează un NULL, dacă funcțiile malloc nu pot aloca cantitatea necesară de memorie. Funcția malloc este accesibilă în TURBO C, header file alloc.h sau stdlib.h, iar pe UNIX va fi disponibil în fișierul antet .

SINTAXĂ

Sintaxa acestei funcții este după cum urmează:

malloc(number of elements * size of each element);

de exemplu,
int *ptr;
ptr=malloc(10*sizeof (int))

Unde mărimea reprezintă dimensiunea memoriei necesare în octeți (adică numărul locațiilor de memorie contigue care urmează să fie alocate).

Dar, așa cum am menționat anterior, funcția malloc returnează un pointer gol, în consecință un operator de distribuție este obligat să schimbe tipul de pointer returnat pe baza nevoii noastre, declarația de mai sus poate fi prezentată în următoarea formă:

ptr_var=(type_cast* ) malloc (size)

În cazul în care ptr_var este numele pointerului care păstrează adresa inițială a blocului de memorie alocată, type_cast este tipul de date în care urmează să fie transformat pointerul returnat (sau tipul void) și dimensiunea descrie dimensiunea blocului de memorie alocată în octeți .

De exemplu:
int *ptr;
ptr=(int*) malloc (10 * size of (int));

Memoria alocată de funcția malloc conține o valoare de gunoi .

Rețineți că pentru a verifica dacă cererea corespunzătoare este generată de malloc pentru a aloca memoria acordată de sistemul RAM sau respinsă (în cazul în care spațiul necesar nu este disponibil). Putem folosi proprietatea în care nu este atribuită cantitatea necesară de memorie, funcția malloc returnează un NULL.

Definiția calloc ()

Funcția calloc funcționează exact la fel ca și funcția malloc, excluzând faptul că aceasta necesită două argumente ca și în cazul malloc (), este nevoie doar de un singur argument.

De exemplu:
int*ptr;
ptr = (int*)calloc(10, 2);

Aici 2 specifică dimensiunea tipului de date într-un octet pentru care dorim să se facă alocarea, ceea ce este în acest caz 2 pentru numere întregi. Și 10 înseamnă numărul de elemente pentru care se va face alocarea.

Amintiți-vă că argumentul transmis funcției malloc a fost (n * 10), este un singur argument care nu este confuz, deoarece mai multe argumente sunt întotdeauna separate prin virgule. Argumentul (n * 10) nu are virgule între ele. Prin urmare, este un singur argument, deși nu unul simplu, ci o expresie.

Revenind la declarația de mai sus, urmând executarea instrucțiunii de mai sus, un program de memorie de 20 de octeți este alocat programului solicitant, iar adresa primului bloc este atribuită programului solicitant, iar adresa primului bloc este atribuită indicatorului PTR.

Memoria alocată de funcția calloc deține toate zerourile. Funcția calloc este de asemenea disponibilă în fișierul antet sau în TURBO C.

Diferențe cheie între malloc și calloc

Principalele diferențe între funcțiile malloc și calloc sunt:

  1. Un bloc unic de memorie cerută este atribuit în malloc în timp ce mai multe blocuri de memorie solicitate sunt alocate de calloc.
  2. Funcția malloc nu elimină și inițializează memoria alocată. Acesta conține o valoare de gunoi și un element din memoria alocată nu poate fi modificat. În schimb, calloc inițializează memoria alocată la zero.
  3. malloc este mai rapid decât calloc datorită cerinței unor pași suplimentari de inițializare în calloc, dar diferența este neglijabilă.
  4. O altă diferență între aceste două este că calloc este un malloc + memset, memset alocă paginile fizice în memorie, în timp ce malloc atribuie doar memoria din halda în adresa virtuală.

Concluzie:

Atât funcțiile malloc cât și calloc sunt utilizate pentru alocarea memoriei și au un anumit avantaj, iar dezavantajul ca malloc este rapid în comparație cu calloc. Mai mult, malloc este mai ușor de utilizat, deoarece necesită doar un singur argument, deoarece calloc alocă memoria și inițiază zona de memorie cu ZERO. Dar ați prefera să utilizați calloc când inițializarea variabilelor este mai importantă pentru dvs.

Top