kalloc vs malloc

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.

Võrdlusdiagramm

Erinevused - sarnasused - kalloci ja malloci võrdlustabel
kallokkmalloc
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.

Sisu: kalloc vs malloc

  • 1 Süntaks ja näited
    • 1.1 malloc ()
    • 1,2 kalloki ()
  • 2 Video, mis selgitab Calloci, Malloci ja Realloci
  • 3 Turvalisuse kaalutlused
  • 4 Täitmise kiirus
  • 5 viidet

Süntaks ja näited

malloc ()

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.

calloc ()

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); 

Video, mis selgitab Calloci, Malloci ja Realloci

See videoõpetus selgitab mälu jaotamise funktsioone malloc, kallokk ja realloc, samuti mälu eraldamise funktsioon tasuta:

Turvalisuse kaalutlused

Ü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.

Täitmise kiirus

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.

Viited

  • kallokk mehe leht
  • malloc mehe leht