Kad kalloks tiek izmantots atmiņas bloka piešķiršanai, piešķirtais reģions tiek inicializēts uz nulli. Pretstatā tam, malloc nepieskaras piešķirtā atmiņas bloka saturam, kas nozīmē, ka tajā ir atkritumu vērtības. Tas, iespējams, varētu būt drošības risks, jo atmiņas saturs nav prognozējams, un programmēšanas kļūdas var izraisīt šī satura noplūdi.
kalloks | malloc | |
---|---|---|
Funkcija | piešķir pietiekami lielu atmiņas reģionu, lai katrā varētu turēt "n elementus" ar "lieluma" baitiem. Inicializē arī atmiņas saturu līdz nullei. | piešķir "lieluma" atmiņas baitus. |
Argumentu skaits | 2 | 1 |
Sintakse | void * calloc (skaits_bloku skaits ,_izmēru_izmērs_bloķēt_in_bytes); | void * malloc (izmērs_in_baiti); |
Piešķirtās atmiņas saturs | Piešķirtais reģions tiek inicializēts uz nulli. | Piešķirtās atmiņas saturs netiek mainīts. t.i., atmiņā ir neparedzamas vai atkritumu vērtības. Tas rada risku. |
Atgriešanās vērtība | tukšs rādītājs (tukšs *). Ja sadale izdodas, tiek atgriezts rādītājs atmiņas blokam. Ja atmiņas piešķiršana neizdodas, tiek atgriezts rādītājs NULL. | tukšs rādītājs (tukšs *). Ja sadale izdodas, tiek atgriezts rādītājs atmiņas blokam. Ja atmiņas piešķiršana neizdodas, tiek atgriezts rādītājs NULL. |
void * malloc (izmērs_t lielums);
piešķir Izmērs
atmiņas baiti. Ja piešķiršana izdodas, tiek atgriezts rādītājs piešķirtajai atmiņai. Citādi NULL
tiek atgriezts. Piemērs:
/ * Piešķiriet atmiņu masīvam ar 15 tipa elementiem int. * / int * ptr = malloc (15 * sizeof (int)); if (ptr == NULL) / * Atmiņu nevarēja piešķirt, tāpēc izdrukājiet kļūdu un izejiet. * / fprintf (stderr, "Nevarēja piešķirt atmiņu \ n"); izeja (EXIT_FAILURE); / * Piešķiršana izdevās. * /
Pieraksti to malloc
prasa, lai mēs aprēķinātu nepieciešamos atmiņas baitus un nodotu to kā argumentu malloc.
void * calloc (izmērs_t nelegāli, lielums_t baiti);
piešķir pietiekami biežu atmiņas bloku, lai to varētu turēt nelegāli
lieluma baiti
katrs. Piešķirtais reģions tiek inicializēts uz nulli. Iepriekš minētajā piemērā:
/ * Piešķiriet vietu masīvam ar 15 tipa elementiem int un inicializēt līdz nullei. * / int * ptr = calloc (15, izmērs (int)); if (ptr == NULL) / * Atmiņu nevarēja piešķirt, tāpēc izdrukājiet kļūdu un izejiet. * / fprintf (stderr, "Nevarēja piešķirt atmiņu \ n"); izeja (EXIT_FAILURE); / * Piešķiršana izdevās. * /
kalloks (m, n) ir tāds pats kā
p = malloks (m * n); if (p) memset (p, 0, m * n);
Šī video apmācība izskaidro atmiņas piešķiršanas funkcijas malloc
, kalloks
un realloc
, kā arī atmiņas atdalīšanas funkcija bez maksas
:
Parasti ir laba ideja to izmantot kalloks
pāri malloc
. Ja izmantojat malloc, piešķirtās atmiņas saturs nav prognozējams. Programmēšanas kļūdas var izraisīt šī atmiņas satura noplūdi netīšā, bet ļoti neaizsargātā veidā. Labs šādas noplūdes piemērs ir Heartbleed ievainojamība OpenSSL, kuras pamatmehānisms ir izskaidrots šajā XKCD komiksā, un vēl dažas tehniskas detaļas ir šajā emuāra ierakstā.
calloc ir nedaudz lēnāks nekā malloc, jo ir jāveic papildu solis inicializētā atmiņas reģiona inicializēšanai. Tomēr praksē ātruma atšķirība ir ļoti maza, un to var ignorēt.