calloc vs. malloc

Kada calloc koristi se za dodjelu bloka memorije, dodijeljeno područje se inicijalizira u nulu. U kontrastu, malloc ne dodiruje sadržaj dodijeljenog bloka memorije, što znači da sadrži vrijednosti smeća. To bi potencijalno moglo biti sigurnosni rizik, jer je sadržaj memorije nepredvidiv, a programske pogreške mogu rezultirati curenjem tih sadržaja.

Usporedni grafikon

Razlike - sličnosti - calloc nasuprot malloc usporednom grafikonu
callocmalloc
Funkcija raspoređuje područje memorije dovoljno veliko da primi "n elemente" veličine "veličine". Također inicijalizira sadržaj memorije na nule. raspoređuje "veličinu" bajtova memorije.
Broj argumenata 2 1
Sintaksa void * calloc (broj_of_blokova, veličina_of_each_block_in_bytes); void * malloc (size_in_bytes);
Sadržaj dodijeljene memorije Dodijeljeno područje inicijalizirano je na nulu. Sadržaj dodijeljene memorije se ne mijenja. tj. memorija sadrži nepredvidive ili smeće vrijednosti. To predstavlja rizik.
Povratna vrijednost void pointer (void *). Ako dodjela uspije, vraća se pokazivač na blok memorije. Ako dodjela memorije ne uspije, vraća se pokazivač NULL. void pointer (void *). Ako dodjela uspije, vraća se pokazivač na blok memorije. Ako dodjela memorije ne uspije, vraća se pokazivač NULL.

Sadržaj: calloc vs. malloc

  • 1 Sintaksa i primjeri
    • 1,1 malloc ()
    • 1,2 calloc ()
  • 2 Video koji objašnjava Calloc, Malloc i Realloc
  • 3 sigurnosna razmatranja
  • 4 Brzina izvršenja
  • 5 Reference

Sintaksa i primjeri

malloc ()

praznina * malloc (size_t size); 

alocira veličina bajtova memorije. Ako dodjela uspije, vraća se pokazivač na dodijeljenu memoriju. Inače NULL je vraćen. Primjer:

/ * Dodijelite memoriju za niz s 15 vrsta tipa int. * / int * ptr = malloc (15 * sizeof (int)); ako (ptr == NULL) / * Memorija se ne može dodijeliti, pa ispišite pogrešku i izađite. * / fprintf (stderr, "Ne mogu dodijeliti memoriju \ n"); izlaz (EXIT_FAILURE);  / * Dodjela je uspjela. * / 

Primjetite to malloc zahtijeva da izračunamo potrebne bajte memorije i proslijedimo to kao argument mallocu.

calloc ()

void * calloc (veličina_t nelements, veličina_t bajtova); 

raspoređuje neprekidni blok memorije dovoljno velik da drži nelements veličine bajtova svaki. Dodijeljeno područje inicijalizirano je na nulu. U gornjem primjeru:

/ * Dodijelite prostor za niz s 15 vrsta tipa int i inicijalizira na nulu. * / int * ptr = calloc (15, sizeof (int)); ako (ptr == NULL) / * Memorija se ne može dodijeliti, pa ispišite pogrešku i izađite. * / fprintf (stderr, "Ne mogu dodijeliti memoriju \ n"); izlaz (EXIT_FAILURE);  / * Dodjela je uspjela. * / 

calloc (m, n) je isto što i

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

Video koji objašnjava Calloc, Malloc i Realloc

Ovaj video vodič objašnjava funkcije raspodjele memorije malloc, calloc i realloc, kao i funkciju razdvajanja memorije besplatno:

Sigurnosna razmatranja

Općenito je dobro koristiti calloc nad malloc. Kada koristite malloc, sadržaj dodijeljene memorije je nepredvidiv. Pogreške programiranja mogu uzrokovati da taj memorijski sadržaj procuri nenamjerno, ali vrlo ranjivi. Dobar primjer takvog propuštanja je Heartbleed ranjivost u OpenSSL-u, čiji je osnovni mehanizam objašnjen u ovom XKCD stripu, a neke više tehničkih detalja možete pronaći u ovom postu na blogu.

Brzina izvršenja

calloc je malo sporiji od malloc-a zbog dodatnog koraka inicijalizacije dodijeljene memorijske regije. Međutim, u praksi je razlika u brzini vrlo mala i može se zanemariti.

Reference

  • calloc man stranica
  • malloc man stranica