calloc vs. malloc

Kdaj calloc se uporablja za dodelitev bloka pomnilnika, dodeljeno območje se inicializira na ničle. V nasprotju, malloc se ne dotika vsebine dodeljenega bloka pomnilnika, kar pomeni, da vsebuje vrednosti smeti. To bi lahko predstavljalo varnostno tveganje, ker je vsebina pomnilnika nepredvidljiva in programske napake lahko povzročijo puščanje teh vsebin.

Primerjalna tabela

Razlike - podobnosti - primerjalna tabela calloc v primerjavi z malloc
callocmalloc
Funkcija dodeli območje pomnilnika, ki je dovolj veliko, da lahko vsebujejo "n elemente" velikosti "velikosti". Prav tako inicializira vsebino pomnilnika na ničle. dodeli "velikost" bajtov pomnilnika.
Število argumentov 2 1
Sintaksa void * calloc (število_of_blocks, velikost_of_each_block_in_bytes); void * malloc (size_in_bytes);
Vsebina dodeljenega pomnilnika Dodeljeno območje se inicializira na nič. Vsebina dodeljenega pomnilnika se ne spremeni. t.j. pomnilnik vsebuje nepredvidljive vrednosti ali smeti. To predstavlja tveganje.
Povratna vrednost void pointer (void *). Če dodelitev uspe, se vrne kazalec na blok pomnilnika. Če dodelitev pomnilnika ne uspe, se vrne kazalec NULL. void pointer (void *). Če dodelitev uspe, se vrne kazalec na blok pomnilnika. Če dodelitev pomnilnika ne uspe, se vrne kazalec NULL.

Vsebina: calloc vs. malloc

  • 1 Sintaksa in primeri
    • 1,1 malloc ()
    • 1,2 calloc ()
  • 2 Video, ki razlaga Calloc, Malloc in Realloc
  • 3 Varnostni razlogi
  • 4 Hitrost izvedbe
  • 5 Reference

Sintaksa in primeri

malloc ()

void * malloc (velikost_t velikosti); 

dodeli velikost bajtov pomnilnika. Če dodelitev uspe, se vrne kazalec na dodeljeni pomnilnik. V nasprotnem primeru NIČ se vrne. Primer:

/ * Dodelite pomnilnik za matriko s 15 elementi tipa int. * / int * ptr = malloc (15 * sizeof (int)); če (ptr == NULL) / * Pomnilnika ni bilo mogoče dodeliti, zato natisnite napako in zapustite. * / fprintf (stderr, "Ne morem dodeliti pomnilnika \ n"); izhod (EXIT_FAILURE);  / * Dodelitev je uspela. * / 

Upoštevajte, da malloc zahteva, da izračunamo potrebne bajte pomnilnika in jih posredujemo kot argument mallocu.

calloc ()

void * calloc (velikost_t nelements, velikost_t bajtov); 

dodeli neprekinjeni blok pomnilnika, ki je dovolj velik za shranjevanje pomanjkljivosti velikosti bajti vsak. Dodeljeno območje se inicializira na nič. V zgornjem primeru:

/ * Dodelite prostor za matriko s 15 elementi tipa int in inicializirati na ničle. * / int * ptr = calloc (15, sizeof (int)); če (ptr == NULL) / * Pomnilnika ni bilo mogoče dodeliti, zato natisnite napako in zapustite. * / fprintf (stderr, "Ne morem dodeliti pomnilnika \ n"); izhod (EXIT_FAILURE);  / * Dodelitev je uspela. * / 

calloc (m, n) je enako kot

p = malloc (m * n); če (p) memset (p, 0, m * n); 

Video, ki razloži Calloc, Malloc in Realloc

Ta video tutorial razlaga funkcije dodeljevanja pomnilnika malloc, calloc in realloc, kot tudi funkcijo razdelitve pomnilnika prost:

Varnostni razlogi

Na splošno je to dobra ideja calloc čez malloc. Ko uporabljate malloc, je vsebina dodeljenega pomnilnika nepredvidljiva. Napake pri programiranju lahko povzročijo, da te pomnilniške vsebine puščajo nenamerno, a zelo ranljivi. Dober primer takega uhajanja je ranljivost Heartbleed v OpenSSL, katere osnovni mehanizem je razložen v tem stripu XKCD, nekaj več tehničnih podrobnosti pa je v tej objavi na spletnem dnevniku.

Hitrost izvedbe

calloc je zaradi dodatnega koraka inicializiranja dodeljenega območja pomnilnika nekoliko počasnejši kot malloc. Vendar je v praksi razlika v hitrosti zelo majhna in jo je mogoče prezreti.

Reference

  • calloc man strani
  • malloc man strani