calloc vs malloc

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.

Jämförelsediagram

calloc mot malloc jämförelsetabell
callocmalloc
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.

Innehåll: calloc vs malloc

  • 1 Syntax och exempel
    • 1,1 malloc ()
    • 1,2 calloc ()
  • 2 Video förklara Calloc, Malloc och Realloc
  • 3 Säkerhetshänsyn
  • 4 Utföringshastighet
  • 5 referenser

Syntax och exempel

malloc ()

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.

calloc ()

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

Video förklara Calloc, Malloc och Realloc

Denna videouppdrag förklarar minnesfördelningsfunktioner malloc, calloc och realloc, såväl som minnesfördelningsfunktionen fri:

Säkerhetshänsyn

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.

Utföringshastighet

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.

referenser

  • calloc man sida
  • malloc man sida