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.
calloc | malloc | |
---|---|---|
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. |
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.
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);
Deze video-tutorial legt geheugen toewijzingsfuncties uit malloc
, calloc
en realloc
, evenals de geheugen de-allocatiefunctie gratis
:
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.
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.