Millal kallokk kasutatakse mäluploki eraldamiseks, eraldatud piirkond lähtestatakse nullini. Seevastu, malloc ei puuduta eraldatud mäluploki sisu, mis tähendab, et see sisaldab prügiväärtusi. See võib olla turvarisk, kuna mälu sisu on ettearvamatu ja programmeerimisvead võivad põhjustada nende sisu lekke.
kallokk | malloc | |
---|---|---|
Funktsioon | eraldab mälupiirkonna, mis on piisavalt suur, et mahutada "n" elementi "suuruses" baiti. Samuti lähtestab mälu sisu nullini. | eraldab mälu "suuruse" baite. |
Argumentide arv | 2 | 1 |
Süntaks | void * calloc (arv_plokke ,_maht_pikkus_blokid_baidites); | tühine * malloc (suurus_in_bytes); |
Eraldatud mälu sisu | Eraldatud piirkond lähtestatakse nulliks. | Eraldatud mälu sisu ei muudeta. st mälu sisaldab ettearvamatuid või prügiväärtusi. See kujutab endast riski. |
Tagastatav väärtus | tühine osuti (tühine *). Kui jaotamine õnnestub, tagastatakse kursor mäluplokile. Kui mälu eraldamine ebaõnnestub, tagastatakse kursor NULL. | tühine osuti (tühine *). Kui jaotamine õnnestub, tagastatakse kursor mäluplokile. Kui mälu eraldamine ebaõnnestub, tagastatakse kursor NULL. |
tühine * malloc (suurus_t suurus);
eraldab suurus
mälu baiti. Kui jaotamine õnnestub, tagastatakse osuti eraldatud mällu. Muidu NULL
tagastatakse. Näide:
/ * Eemaldage mälu 15 tüüpi elemendiga massiivile int. * / int * ptr = malloc (15 * suurusof (int)); if (ptr == NULL) / * Mälu ei saanud eraldada, nii et printige tõrge ja väljuge. * / fprintf (stderr, "Mälu ei saanud eraldada \ n"); väljumine (EXIT_FAILURE); / * Jaotamine õnnestus. * /
Pange tähele malloc
nõuab, et arvutaksime välja vajalikud mälubaidid ja edastaksime selle argumendina malloci.
void * calloc (suurus_tühikud, suurus_t baiti);
eraldab külgneva mäluploki, mis on piisavalt mahukas nelements
suurusest baiti
iga. Eraldatud piirkond lähtestatakse nulliks. Ülaltoodud näites:
/ * Jagage ruumi massiivile, milles on 15 tüüpi elementi int ja lähtestage nullini. * / int * ptr = calloc (15, suurus (int)); if (ptr == NULL) / * Mälu ei saanud eraldada, nii et printige tõrge ja väljuge. * / fprintf (stderr, "Mälu ei saanud eraldada \ n"); väljumine (EXIT_FAILURE); / * Jaotamine õnnestus. * /
kallok (m, n) on sama mis
p = malloc (m * n); if (p) memset (p, 0, m * n);
See videoõpetus selgitab mälu jaotamise funktsioone malloc
, kallokk
ja realloc
, samuti mälu eraldamise funktsioon tasuta
:
Üldiselt on hea mõte seda kasutada kallokk
üle malloc
. Malloci kasutamisel on eraldatud mälu sisu ettearvamatu. Programmeerimisvigade tõttu võib mälusisu lekkida tahtmatult, kuid eriti haavataval viisil. Sellise lekke hea näide on OpenSSL-i Heartbleed'i haavatavus, mille põhimehhanismi selgitatakse selles XKCD koomiksis ja veel mõned tehnilised üksikasjad on selles ajaveebipostituses.
calloc on natuke aeglasem kui malloc, kuna eraldatud mälupiirkonna initsialiseerimiseks on vaja täiendavat sammu. Praktikas on kiiruse erinevus siiski väga väike ja seda võib ignoreerida.