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.
calloc | malloc | |
---|---|---|
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. |
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.
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);
Ovaj video vodič objašnjava funkcije raspodjele memorije malloc
, calloc
i realloc
, kao i funkciju razdvajanja memorije besplatno
:
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.
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.