diferența dintre malloc și calloc

diferența fundamentală dintre funcția malloc și calloc este că calloc () are nevoie de două argumente în loc de un argument care este cerut de malloc (). Ambele malloc () și calloc () sunt funcțiile pe care limbajul de programare C le oferă alocarea dinamică a memoriei și de-alocarea în timpul rulării.

înainte de a înțelege malloc() și calloc() funcții în primul rând să ne înțelegem sensul de alocare a memoriei dinamice. Alocarea memoriei este procedura de atribuire a memoriei computerului pentru executarea programelor și proceselor. Folosim tehnici de alocare dinamică atunci când nu se știe anterior cât spațiu de memorie este necesar pentru program și proces.

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

conținut: malloc() Vs calloc()

  1. diagramă comparație
  2. definiție
  3. diferențe cheie
  4. concluzie

diagramă comparație

baza de comparație malloc() calloc()
nr de blocuri atribuie un singur bloc de memorie cerut. atribuie mai multe blocuri de memorie solicitate.
sintaxă void *malloc(size_t size); void *calloc (size_t num, size_t size);
inițializare malloc() nu șterge și inițializa memoria alocată. memoria alocată este inițializată la zero utilizând calloc().
Mod de alocare malloc() funcția alocă memorie de dimensiune ‘dimensiune’ din heap. funcția calloc() alocă memorie a cărei dimensiune este egală cu dimensiunea num*.
viteza rapid relativ lent.

definiția malloc()

funcția malloc atribuie un bloc de memorie în octeți. Utilizatorul ar trebui să dea în mod explicit dimensiunea blocului, necesită pentru utilizare.

prin Programul de funcții malloc solicită memoria RAM a sistemului pentru alocarea memoriei, dacă cererea este acceptată (adică funcția malloc spune că are succes în alocarea memoriei), returnează un pointer la primul bloc de memorie. Se întoarce tip void de pointer, ceea ce înseamnă că orice tip de pointer pot fi atribuite.

deși, returnează un nul, în cazul în care funcțiile malloc nu este în măsură să aloce cantitatea necesară de memorie. Funcția malloc este accesibilă în TURBO C, fișier antet alloc.h sau stdlib.h , iar pe UNIX va fi disponibil în fișierul antet <malloc.h>.

sintaxa

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 dimensiunea reprezintă dimensiunea memoriei necesară în octeți(adică., numărul de locații de memorie contigue care urmează să fie alocate).

dar, așa cum am menționat anterior, funcția malloc returnează un pointer void, prin urmare, un operator cast este obligat să schimbe tipul de pointer returnat în funcție de nevoia noastră, Declarația de mai sus ar putea fi prezentată în următoarea formă:

ptr_var=(type_cast* ) malloc (size)

unde ptr_var este numele indicatorului care reține adresa de pornire a blocului de memorie alocat, type_cast este tipul de date în care indicatorul returnat (sau tipul void) urmează să fie transformat, iar dimensiunea descrie dimensiunea memoriei alocate blocați în octeți.

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

memoria alocată de funcția malloc conține valoarea gunoiului.

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 face uz de proprietatea în care cantitatea necesară de memorie nu este atribuit funcția malloc returnează un nul.

definiția calloc ()

funcția calloc funcționează exact la fel ca funcția malloc, excluzând faptul că necesită două argumente, deoarece în cazul malloc() este necesar 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, care este acest caz este 2 Pentru numere întregi. Și 10 înseamnă numărul de elemente pentru care urmează să se facă alocarea.

amintiți-vă că argumentul a trecut la funcția malloc a fost (n*10), este un singur argument nu trebuie confundat, 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, după executarea Declarației de mai sus, un bloc de memorie de 20 de octeți este alocat programului solicitant și adresa primului bloc este atribuită programului solicitant, iar adresa primului bloc este atribuită pointerului ptr.

memoria alocată de funcția calloc deține toate zerourile. Funcția calloc poate fi obținută și în fișierul antet<stdlib.h> sau<alloc.h> în TURBO C.

diferențe cheie între malloc și calloc

diferențele principale dintre funcțiile malloc și calloc sunt:

  1. un singur bloc de memorie solicitată este atribuit în malloc în timp ce mai multe blocuri de memorie solicitată sunt alocate de calloc.
  2. funcția malloc nu șterge și inițializează memoria alocată. Acesta conține valoarea de gunoi și 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 de 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 heap în adresa virtuală.

concluzie

atât funcțiile malloc, cât și calloc sunt utilizate pentru alocarea memoriei și au anumite avantaje, iar dezavantajul ca malloc este rapid în comparație cu calloc. Mai mult decât atât, malloc mai ușor de utilizat, deoarece este nevoie de un singur argument, deoarece calloc alocă memorie și inițializa zona de memorie cu ZERO. Dar ați prefera să utilizați calloc atunci când inițializarea variabilă este mai importantă pentru dvs.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *