kalloks pret malloku

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.

Salīdzināšanas tabula

Atšķirības - līdzības - kalloka un malloka salīdzināšanas diagramma
kalloksmalloc
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.

Saturs: kalloks un malloks

  • 1 Sintakse un piemēri
    • 1.1 malloc ()
    • 1,2 kalloks ()
  • 2 Video, kas izskaidro Calloc, Malloc un Realloc
  • 3 Drošības apsvērumi
  • 4 Izpildes ātrums
  • 5 atsauces

Sintakse un piemēri

malloc ()

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.

kalloks ()

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, kas izskaidro Calloc, Malloc un Realloc

Šī video apmācība izskaidro atmiņas piešķiršanas funkcijas malloc, kalloks un realloc, kā arī atmiņas atdalīšanas funkcija bez maksas:

Drošības apsvērumi

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

Izpildes ātrums

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.

Atsauces

  • kalloks man lapa
  • malloc man lapa