Pred razumevanjem funkcij malloc () in calloc () najprej razumemo pomen dinamičnega dodeljevanja pomnilnika. Dodeljevanje pomnilnika je postopek dodeljevanja računalniškega pomnilnika za izvajanje programov in procesov. Uporabljamo dinamične tehnike dodeljevanja, kadar ni znano, koliko prostora potrebuje program in proces.
Dinamično dodeljevanje pomnilnika se pojavi zaradi težav, povezanih z dodelitvijo statičnega pomnilnika, na primer, če je shranjenih manj elementov, potem se preostanek pomnilnika po nepotrebnem zapravlja. Zato odpravlja težave pri statični dodelitvi pomnilnika, kjer je pomnilnik dodeljen samo takrat, ko je potreben.
Primerjalna tabela
Osnova za primerjavo | malloc () | calloc () |
---|---|---|
Št blokov | Dodeli en blok zahtevanega pomnilnika. | Dodeli več blokov zahtevanega pomnilnika. |
Sintaksa | void * malloc (velikost size_t); | void * calloc (size_t num, size_t size); |
Inicializacija | malloc () ne izbriše in inicializira dodeljenega pomnilnika. | Dodeljeni pomnilnik se inicializira na nič z uporabo calloc (). |
Način dodeljevanja | Funkcija malloc () dodeli pomnilnik velikosti 'size' iz kopice. | calloc () funkcija dodeli pomnilnik, katerega velikost je enaka num * velikosti. |
Hitrost | Hitro | Primerjalno počasen. |
Opredelitev malloc ()
Funkcija malloc dodeli blok pomnilnika v bajtih . Uporabnik mora izrecno navesti velikost bloka, ki jo potrebuje za uporabo.
Skozi malloc funkcijo program zahteva RAM sistema za dodelitev pomnilnika, če je zahteva sprejeta (tj., Malloc funkcija pravi uspešna pri dodeljevanju pomnilnika), vrne kazalec na prvi blok pomnilnika. Vrne void tip kazalca, kar pomeni, da je lahko dodeljena katera koli vrsta kazalca.
Čeprav vrne NULL, če funkcije malloc ne morejo dodeliti zahtevane količine pomnilnika. Funkcija malloc je dostopna v TURBO C, datoteki glave alloc.h
ali stdlib.h
, v UNIX pa bo na voljo v glavi datoteke .
SYNTAX
Sintaksa te funkcije je naslednja:
malloc(number of elements * size of each element);
na primer, int *ptr;
ptr=malloc(10*sizeof (int))
Kjer velikost predstavlja velikost potrebnega pomnilnika v bajtih (tj. Število sosednjih pomnilniških mest, ki jih je treba dodeliti).
Toda kot je bilo že omenjeno, funkcija malloc vrne void kazalec, zato je operater za cast potreben za spremembo vrnjenega tipa kazalca glede na našo potrebo, zgornja deklaracija je lahko predstavljena v naslednji obliki:
ptr_var=(type_cast* ) malloc (size)
Kjer je ptr_var
ime kazalca, ki obdrži začetni naslov dodeljenega pomnilniškega bloka, je type_cast
podatkovni tip, v katerega je treba pretvoriti vrnjeni kazalec (ali tip void), velikost pa opisuje velikost dodeljenega pomnilniškega bloka v bajtih .
Na primer: int *ptr;
ptr=(int*) malloc (10 * size of (int));
Pomnilnik, dodeljen s funkcijo malloc, vsebuje vrednost smeti .
Upoštevajte, da preverite, ali je ustrezna zahteva generirana z malloc, da dodelite pomnilnik, ki ga dodeli sistemski RAM, ali zavrnite (v primeru, da prostor ni potreben). Lahko uporabimo lastnost, v kateri potrebna količina pomnilnika ni dodeljena, funkcija malloc vrne NULL.
Opredelitev calloc ()
Funkcija calloc deluje natančno enako kot funkcija malloc, razen dejstva, da zahteva dva argumenta, kot v primeru malloc () je potreben le en argument.
Na primer: int*ptr;
ptr = (int*)calloc(10, 2);
Tu 2 določa velikost podatkovnega tipa v bajtu, za katerega želimo dodelitev, kar je v tem primeru 2 za cela števila. In 10 pomeni število elementov, za katere je treba dodeliti sredstva.
Ne pozabite, da je bil argument posredovan funkciji malloc (n * 10), da je en sam argument, ne zmedite se, ker je več argumentov vedno ločenih z vejicami. Argument (n * 10) med seboj nima vejic. Zato je to en sam argument, čeprav ne preprost, ampak izraz.
Če se vrnete na zgornjo deklaracijo, je po izvršitvi zgornje izjave pomnilniški blok 20 bajtov dodeljen zahtevajočemu programu in naslov prvega bloka je dodeljen zahtevajočemu programu, naslov prvega bloka pa je dodeljen kazalcu ptr.
Pomnilnik, dodeljen funkciji calloc, zadrži vse ničle. Funkcija calloc je na voljo tudi v datoteki z glavo ali
v TURBO C.
Ključne razlike med malloc in calloc
Primarne razlike med malloc in calloc funkcijami so:
- En blok zahtevanega pomnilnika je dodeljen v malloc, medtem ko je več blokov zahtevanega pomnilnika dodeljenih s calloc.
- Funkcija malloc ne izbriše in inicializira dodeljenega pomnilnika. Vsebuje vrednost smeti in element dodeljenega pomnilnika ni mogoče spremeniti. Nasprotno, calloc sproži dodeljeni pomnilnik na nič.
- malloc je hitrejši od calloc zaradi zahteve po dodatnih korakih inicializacije v calloc, vendar je razlika zanemarljiva.
- Druga razlika med njima je, da je calloc malloc + memset, memset dodeli fizične strani v pomnilniku, medtem ko malloc samo dodeli pomnilnik iz kopice v virtualnem naslovu.
Sklep:
Funkcije malloc in calloc se uporabljajo za dodelitev pomnilnika in imajo določeno prednost, slabost, kot je malloc, je hitra v primerjavi s calloc. Poleg tega je malloc lažji za uporabo, saj potrebuje le en argument, ker calloc dodeli pomnilnik in inicializira pomnilniško območje z ZERO. Vendar pa bi raje uporabili calloc, če je za vas pomembnejša inicializacija spremenljivk .