När calloc används för att allokera ett block av minne, den tilldelade regionen initialiseras till nollor. I kontrast, malloc Rör inte innehållet i det tilldelade minnesblocket, vilket innebär att det innehåller skräpvärden. Detta kan eventuellt vara en säkerhetsrisk eftersom innehållet i minnet är oförutsägbart och programmeringsfel kan resultera i läckage av dessa innehåll.
calloc | malloc | |
---|---|---|
Fungera | allokerar en region av minne som är tillräckligt stor för att hålla "n element" av "storlek" byte vardera. Initialiserar också innehållet av minne till nollor. | allokerar "storlek" byte av minne. |
Antal argument | 2 | 1 |
Syntax | void * calloc (number_of_blocks, size_of_each_block_in_bytes); | void * malloc (size_in_bytes); |
Innehållet i allokerat minne | Den tilldelade regionen initialiseras till noll. | Innehållet i tilldelat minne ändras inte. d.v.s. minnet innehåller oförutsägbara eller skräpvärden. Detta utgör en risk. |
Returvärde | tomrumsindikatorn (tomrum *). Om tilldelningen lyckas, returneras en pekare till minnesblocket. Om minnesfördelningen misslyckas returneras en NULL-pekare. | tomrumsindikatorn (tomrum *). Om tilldelningen lyckas, returneras en pekare till minnesblocket. Om minnesfördelningen misslyckas returneras en NULL-pekare. |
void * malloc (size_t storlek);
allokerar storlek
byte av minne. Om tilldelningen lyckas, returneras en pekare till det tilldelade minnet. Annat NULL
returneras. Exempel:
/ * Tilldela minne för en array med 15 element av typen int. * / int * ptr = malloc (15 * sizeof (int)); om (ptr == NULL) / * Minne kunde inte tilldelas, så skriv ut ett fel och avsluta. * / fprintf (stderr, "Kunde inte allokera minne \ n"); exit (EXIT_FAILURE); / * Tilldelningen lyckades. * /
Anteckna det malloc
kräver att vi beräknar de bytes minne vi behöver, och överför det som ett argument till malloc.
void * calloc (size_t nelements, size_t bytes);
tilldelar ett sammanhängande block av minne som är tillräckligt stor för att hålla nelements
av storlek bitgrupper
varje. Den tilldelade regionen initialiseras till noll. I ovanstående exempel:
/ * Tilldela utrymme för en array med 15 element av typen int och initiera till nollor. * / int * ptr = calloc (15, sizeof (int)); om (ptr == NULL) / * Minne kunde inte tilldelas, så skriv ut ett fel och avsluta. * / fprintf (stderr, "Kunde inte allokera minne \ n"); exit (EXIT_FAILURE); / * Tilldelningen lyckades. * /
calloc (m, n) är samma som
p = malloc (m * n); om (p) memset (p, 0, m * n);
Denna videouppdrag förklarar minnesfördelningsfunktioner malloc
, calloc
och realloc
, såväl som minnesfördelningsfunktionen fri
:
Det är generellt en bra idé att använda calloc
över malloc
. När du använder malloc är innehållet i det tilldelade minnet oförutsägbart. Programmeringsfel kan orsaka att innehållet i minnet läcker ut på oavsiktliga men mycket sårbara sätt. Ett bra exempel på en sådan läcka är Heartbleed sårbarheten i OpenSSL, vars grundläggande mekanism förklaras i den här XKCD-serien och några mer tekniska detaljer finns i denna blogginlägg.
calloc är en liten bit långsammare än malloc på grund av det extra steget att initialisera det tilldelade minnesområdet. I praktiken är skillnaden i hastighet dock väldigt liten och kan ignoreras.