Kada kallokas yra naudojamas atminties blokui paskirstyti, paskirstytas regionas yra inicializuojamas į nulį. Priešingai, mallokas neliečia priskirto atminties bloko turinio, o tai reiškia, kad jame yra šiukšlių vertės. Tai gali sukelti pavojų saugumui, nes atminties turinys yra nenuspėjamas, o programavimo klaidos gali išpūsti šį turinį.
kallokas | mallokas | |
---|---|---|
Funkcija | skiria pakankamai didelę atminties sritį, kad kiekvienas galėtų laikyti „n“ elementus „dydžio“ baitais. Taip pat inicijuoja atminties turinį iki nulio. | skiria „dydžio“ atminties baitus. |
Argumentų skaičius | 2 | 1 |
Sintaksė | void * calloc (skaičius_blokų, dydis_papildomas_blokuoti_inbaitų); | void * malloc (dydis_in_bytes); |
Paskirtosios atminties turinys | Paskirtas regionas inicializuojamas iki nulio. | Paskirtos atminties turinys nekeičiamas. y., atmintyje yra nenuspėjamų ar šiukšlių verčių. Tai kelia riziką. |
Grąžinimo vertė | void rodyklė (void *). Jei paskirstyti pavyksta, rodiklis į atminties bloką grąžinamas. Jei atminties paskirstyti nepavyksta, grąžinamas žymeklis NULL. | void rodyklė (void *). Jei paskirstyti pavyksta, rodiklis į atminties bloką grąžinamas. Jei atminties paskirstyti nepavyksta, grąžinamas žymeklis NULL. |
void * malloc (dydis_t dydis);
skiria dydis
baitų atminties. Jei paskirstymas pavyksta, rodyklė į paskirtą atmintį grąžinama. Kitaip NULL
yra grąžinamas. Pavyzdys:
/ * Skirkite atmintį masyvui su 15 tipo elementų int. * / int * ptr = malloc (15 * dydisof (int)); if (ptr == NULL) / * Atmintis negalėjo būti paskirta, todėl atsispausdinkite klaidą ir išeikite. * / fprintf (stderr, "Nepavyko paskirstyti atminties \ n"); išėjimas (EXIT_FAILURE); / * Paskirstymas pavyko. * /
Prisimink tai mallokas
reikalauja, kad mes apskaičiuotume reikalingus atminties baitus ir perduotume tai kaip argumentą malloc.
void * calloc (dydis_t nelegalai, dydis_t baitai);
skiria gretimą atminties bloką, kurio dydis yra pakankamai didelis nelegalai
dydžio baitų
kiekviena. Paskirtas regionas inicializuojamas iki nulio. Aukščiau pateiktame pavyzdyje:
/ * Skirkite vietos masyvui su 15 tipo elementų int ir inicijuokite iki nulio. * / int * ptr = calloc (15, dydisof (int)); if (ptr == NULL) / * Atmintis negalėjo būti paskirta, todėl atsispausdinkite klaidą ir išeikite. * / fprintf (stderr, "Nepavyko paskirstyti atminties \ n"); išėjimas (EXIT_FAILURE); / * Paskirstymas pavyko. * /
kallokas (m, n) yra toks pat kaip
p = mallokas (m * n); if (p) memset (p, 0, m * n);
Šiame vaizdo įrašo vadove paaiškintos atminties paskirstymo funkcijos mallokas
, kallokas
ir realloc
, taip pat atminties paskirstymo funkcija Laisvas
:
Paprastai gera idėja naudoti kallokas
per mallokas
. Kai naudojate „malloc“, paskirtos atminties turinys nenuspėjamas. Programavimo klaidų dėka šis atminties turinys gali nutekėti netyčia, tačiau labai pažeidžiamas. Geras tokio nutekėjimo pavyzdys yra „Openble“ pažeidžiamumas „Heartbleed“, kurio pagrindinis mechanizmas paaiškintas šiame XKCD komikse, o dar keletas techninių duomenų yra šiame tinklaraščio įraše..
„calloc“ yra šiek tiek lėtesnis nei „malloc“ dėl papildomo priskirtos atminties srities inicijavimo žingsnio. Tačiau praktikoje greičio skirtumas yra labai mažas ir jo galima nepaisyti.