calloc vs. malloc

Wanneer calloc wordt gebruikt om een ​​blok geheugen toe te wijzen, het toegewezen gebied wordt geïnitialiseerd naar nullen. In tegenstelling tot, malloc raakt de inhoud van het toegewezen blok geheugen niet aan, wat betekent dat het afvalwaarden bevat. Dit kan een veiligheidsrisico vormen, omdat de inhoud van het geheugen onvoorspelbaar is en programmeerfouten kunnen resulteren in het lekken van deze inhoud.

Vergelijkingstabel

calloc versus malloc vergelijkingsgrafiek
callocmalloc
Functie wijst een geheugengebied toe dat groot genoeg is om elk "n elementen" van "size" bytes te bevatten. Initialiseert ook de inhoud van het geheugen naar nullen. wijst "grootte" bytes van geheugen toe.
Aantal argumenten 2 1
Syntaxis void * calloc (number_of_blocks, size_of_each_block_in_bytes); void * malloc (size_in_bytes);
Inhoud van toegewezen geheugen Het toegewezen gebied wordt geïnitialiseerd op nul. De inhoud van het toegewezen geheugen is niet gewijzigd. d.w.z. het geheugen bevat onvoorspelbare of afvalwaarden. Dit vormt een risico.
Winstwaarde void pointer (void *). Als de toewijzing slaagt, wordt een verwijzing naar het geheugenblok geretourneerd. Als de toewijzing van geheugen mislukt, wordt een NULL-aanwijzer geretourneerd. void pointer (void *). Als de toewijzing slaagt, wordt een verwijzing naar het geheugenblok geretourneerd. Als de toewijzing van geheugen mislukt, wordt een NULL-aanwijzer geretourneerd.

Inhoud: calloc vs. malloc

  • 1 Syntaxis en voorbeelden
    • 1,1 malloc ()
    • 1.2 calloc ()
  • 2 video met Calloc, Malloc en Realloc
  • 3 Veiligheidsoverwegingen
  • 4 Snelheid van uitvoering
  • 5 Referenties

Syntaxis en voorbeelden

malloc ()

void * malloc (size_t size); 

ken toe grootte bytes van geheugen. Als de toewijzing slaagt, wordt een wijzer naar het toegewezen geheugen geretourneerd. Anders NUL wordt teruggestuurd. Voorbeeld:

/ * Wijs geheugen toe voor een array met 15 elementen van het type int. * / int * ptr = malloc (15 * sizeof (int)); if (ptr == NULL) / * Geheugen kan niet worden toegewezen, druk daarom een ​​fout af en sluit af. * / fprintf (stderr, "Kon geheugen niet toewijzen \ n"); exit (EXIT_FAILURE);  / * Toewijzing geslaagd. * / 

Let daar op malloc vereist dat we de bytes van het geheugen berekenen die we nodig hebben, en dit doorgeven aan malloc.

calloc ()

void * calloc (size_t nelements, size_t bytes); 

wijst een aaneengesloten blok geheugen toe dat groot genoeg is om te bewaren Nelements van grootte bytes elk. Het toegewezen gebied wordt geïnitialiseerd op nul. In het bovenstaande voorbeeld:

/ * Wijs ruimte toe voor een array met 15 elementen van het type int en initialiseer naar nullen. * / int * ptr = calloc (15, sizeof (int)); if (ptr == NULL) / * Geheugen kan niet worden toegewezen, druk daarom een ​​fout af en sluit af. * / fprintf (stderr, "Kon geheugen niet toewijzen \ n"); exit (EXIT_FAILURE);  / * Toewijzing geslaagd. * / 

calloc (m, n) is hetzelfde als

p = malloc (m * n); als (p) memset (p, 0, m * n); 

Video over Calloc, Malloc en Realloc

Deze video-tutorial legt geheugen toewijzingsfuncties uit malloc, calloc en realloc, evenals de geheugen de-allocatiefunctie gratis:

Veiligheidsoverwegingen

Het is over het algemeen een goed idee om te gebruiken calloc over- malloc. Wanneer u malloc gebruikt, is de inhoud van het toegewezen geheugen onvoorspelbaar. Programmafouten kunnen ervoor zorgen dat deze geheugeninhoud op onbedoelde maar zeer kwetsbare manieren lekt. Een goed voorbeeld van een dergelijk lek is de Heartbleed-kwetsbaarheid in OpenSSL, waarvan het basismechanisme wordt uitgelegd in deze XKCD-strip en wat meer technische details in deze blogpost staan.

Snelheid van uitvoering

calloc is een klein beetje langzamer dan malloc vanwege de extra stap van het initialiseren van de toegewezen geheugenregio. In de praktijk is het verschil in snelheid echter erg klein en kan worden genegeerd.

Referenties

  • calloc man pagina
  • malloc man pagina