Kun calloc Käytetään allokoimaan muistilohko, allokoitu alue alustetaan nollaksi. Verrattuna, malloc ei koske varatun muistilohkon sisältöä, mikä tarkoittaa, että se sisältää roskiarvoja. Tämä saattaa olla tietoturvariski, koska muistin sisältöä ei voida ennustaa ja ohjelmointivirheet voivat johtaa näiden sisältöjen vuotamiseen.
calloc | malloc | |
---|---|---|
Toimia | allokoi muistialueen, joka on riittävän suuri pitämään "n" elementtiä, joiden koko on tavu. Alustaa muistin sisällön myös nollaan. | allokoi "koon" tavua muistia. |
Argumenttien lukumäärä | 2 | 1 |
Syntaksi | void * calloc (lukumäärä_lohkoja, koko_jako_lohko_in_bytes); | tyhjä * malloc (koko_in_bytes); |
Jaetun muistin sisältö | Jaettu alue alustetaan nollaan. | Jaetun muistin sisältöä ei muuteta. ts. muisti sisältää arvaamattomia tai jätearvoja. Tämä aiheuttaa riskin. |
Palautusarvo | tyhjä osoitin (tyhjä *). Jos allokointi onnistuu, osoitin muistimuistille palautetaan. Jos muistin varaaminen epäonnistuu, NULL-osoitin palautetaan. | tyhjä osoitin (tyhjä *). Jos allokointi onnistuu, osoitin muistimuistille palautetaan. Jos muistin varaaminen epäonnistuu, NULL-osoitin palautetaan. |
tyhjä * malloc (koko_koko);
allokoi koko
tavua muistia. Jos allokointi onnistuu, osoitin allokoituun muistiin palautetaan. Muuten TYHJÄ
palautetaan. Esimerkki:
/ * Varaa muisti taulukkoon, jossa on 15 tyyppiä int. * / int * ptr = malloc (15 * kokoof (int)); if (ptr == NULL) / * Muistia ei voitu allokoida, tulosta virhe ja poistu. * / fprintf (stderr, "Muistia ei voitu allokoida \ n"); exit (EXIT_FAILURE); / * Allokaatio onnistui. * /
Ota huomioon, että malloc
vaatii, että laskemme tarvittavat muistitavut ja välitämme sen argumenttina mallocille.
void * calloc (koko_tiedot, koko_t tavua);
varaa vierekkäisen muistitilan, joka on riittävän suuri pitämään nelements
kokoa tavua
kukin. Jaettu alue alustetaan nollaan. Yllä olevassa esimerkissä:
/ * Varaa tilaa taulukotyypille, jossa on 15 tyyppiä int ja alustaa nollaan. * / int * ptr = kallokki (15, koko (int)); if (ptr == NULL) / * Muistia ei voitu allokoida, tulosta virhe ja poistu. * / fprintf (stderr, "Muistia ei voitu allokoida \ n"); exit (EXIT_FAILURE); / * Allokaatio onnistui. * /
kallokki (m, n) on sama kuin
p = malloc (m * n); if (p) memset (p, 0, m * n);
Tämä video-opas selittää muistin varaustoiminnot malloc
, calloc
ja RealLOC
, samoin kuin muistin purkamistoiminto vapaa
:
Se on yleensä hyvä idea käyttää calloc
yli malloc
. Kun käytät mallokkia, varatun muistin sisältö ei ole ennustettavissa. Ohjelmointivirheet voivat aiheuttaa muistin sisällön vuotamisen tahattomasti, mutta erittäin haavoittuvasti. Hyvä esimerkki tällaisesta vuodosta on HeartSSed-haavoittuvuus OpenSSL: ssä, jonka perusmekanismi selitetään tässä XKCD-sarjakuvassa ja joitain muita teknisiä yksityiskohtia on tässä blogiviestissä.
calloc on vähän hitaampi kuin malloc johtuen ylimääräisestä vaiheesta allokoidun muistialueen alustamiseksi. Käytännössä nopeusero on kuitenkin hyvin pieni ja sitä voidaan jättää huomioimatta.