kalloc vs. malloc

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.

Vertailutaulukko

Erot - yhtäläisyydet - vertailutaulukko kalloc vs. malloc
callocmalloc
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.

Sisältö: kalloc vs. malloc

  • 1 Syntaksi ja esimerkit
    • 1.1 malloc ()
    • 1,2 kallokkia ()
  • 2 Video, joka selittää Callocin, Mallocin ja Reallocin
  • 3 Turvallisuusnäkökohdat
  • 4 Suorituksen nopeus
  • 5 Viitteet

Syntaksi ja esimerkit

malloc ()

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.

calloc ()

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

Video selittäen Callocin, Mallocin ja Reallocin

Tämä video-opas selittää muistin varaustoiminnot malloc, calloc ja RealLOC, samoin kuin muistin purkamistoiminto vapaa:

Turvallisuusnäkökohdat

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

Suorituksen nopeus

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.

Viitteet

  • calloc miessivu
  • malloc miessivu