Kedy calloc sa používa na pridelenie bloku pamäte, alokovaná oblasť je inicializovaná na nuly. Na rozdiel od toho, malloc sa nedotýka obsahu alokovaného bloku pamäte, čo znamená, že obsahuje hodnoty odpadu. Môže to byť potenciálne bezpečnostné riziko, pretože obsah pamäte je nepredvídateľný a chyby v programovaní môžu viesť k úniku tohto obsahu.
calloc | malloc | |
---|---|---|
funkcie | alokuje oblasť pamäte dostatočne veľkú na to, aby pojala „n elementov“ „veľkosť“ bajtov. Inicializuje tiež obsah pamäte na nulu. | alokuje "veľkosť" bajtov pamäte. |
Počet argumentov | 2 | 1 |
syntax | void * calloc (number_of_blocks, size_of_each_block_in_bytes); | void * malloc (size_in_bytes); |
Obsah pridelenej pamäte | Alokovaná oblasť sa inicializuje na nulu. | Obsah alokovanej pamäte sa nezmení. to znamená, že pamäť obsahuje nepredvídateľné alebo odpadkové hodnoty. To predstavuje riziko. |
Návratová hodnota | ukazovateľ neplatnosti (neplatné *). Ak je pridelenie úspešné, vráti sa ukazovateľ na blok pamäte. Ak pridelenie pamäte zlyhá, vráti sa NULL ukazovateľ. | ukazovateľ neplatnosti (neplatné *). Ak je pridelenie úspešné, vráti sa ukazovateľ na blok pamäte. Ak pridelenie pamäte zlyhá, vráti sa NULL ukazovateľ. |
void * malloc (size_t size);
alokuje veľkosť
bajtov pamäte. Ak je priradenie úspešné, vráti sa ukazovateľ na pridelenú pamäť. Inak NULOVÝ
je vrátený. Príklad:
/ * Prideľte pamäť pre pole s 15 prvkami typu int. * / int * ptr = malloc (15 * veľkosť (int)); if (ptr == NULL) / * Pamäť sa nedala alokovať, takže vytlačte chybu a ukončite. * / fprintf (stderr, "Nepodarilo sa prideliť pamäť \ n"); výstup (EXIT_FAILURE); / * Pridelenie bolo úspešné. * /
Poznač si to malloc
vyžaduje, aby sme vypočítali bajty pamäte, ktoré potrebujeme, a odovzdali to ako argument mallocu.
void * calloc (size_t nelements, size_t bytes);
alokuje priľahlý blok pamäte, ktorý je dostatočne veľký na uloženie nelements
veľkosti bajtov
každej z nich. Alokovaná oblasť sa inicializuje na nulu. V uvedenom príklade:
/ * Pridelte priestor pre pole s 15 prvkami typu int a inicializovať na nulu. * / int * ptr = calloc (15, veľkosť (int)); if (ptr == NULL) / * Pamäť sa nedala alokovať, takže vytlačte chybu a ukončite. * / fprintf (stderr, "Nepodarilo sa prideliť pamäť \ n"); výstup (EXIT_FAILURE); / * Pridelenie bolo úspešné. * /
calloc (m, n) je rovnaké ako
p = malloc (m * n); ak (p) memset (p, 0, m * n);
Tento výukový program vysvetľuje funkcie priradenia pamäte malloc
, calloc
a realloc
, ako aj funkciu delokácie pamäte zadarmo
:
To je všeobecne dobrý nápad použiť calloc
cez malloc
. Ak použijete malloc, obsah alokovanej pamäte je nepredvídateľný. Chyby programovania môžu spôsobiť neúmyselné, ale vysoko zraniteľné spôsoby úniku tohto obsahu pamäte. Dobrým príkladom takéhoto úniku je zraniteľnosť Heartbleed v OpenSSL, ktorého základný mechanizmus je vysvetlený v tomto komikse XKCD a ďalšie technické podrobnosti sú uvedené v tomto blogovom príspevku..
calloc je o niečo pomalší ako malloc kvôli ďalšiemu kroku inicializácie pridelenej oblasti pamäte. V praxi je však rozdiel v rýchlosti veľmi malý a možno ho ignorovať.