calloc vs malloc

Når calloc brukes til å tilordne en blokk med minne, blir den tildelte regionen initialisert til nuller. I motsetning, malloc berører ikke innholdet i den tildelte minnekortet, noe som betyr at det inneholder søppelverdier. Dette kan potensielt være en sikkerhetsrisiko fordi innholdet i minnet er uforutsigbart og programmeringsfeil kan føre til en lekkasje av innholdet.

Sammenligningstabell

calloc versus malloc sammenligning diagram
callocmalloc
Funksjon tildeler en region med minne som er stort nok til å holde "n elementer" av "størrelse" byte hver. Også initialiserer innholdet av minne til nuller. tildeler "størrelse" byte av minne.
Antall argumenter 2 1
syntax void * calloc (number_of_blocks, size_of_each_block_in_bytes); void * malloc (size_in_bytes);
Innhold av allokert minne Den tildelte regionen initialiseres til null. Innholdet i allokert minne blir ikke endret. d.v.s. minnet inneholder uforutsigbare eller søppelverdier. Dette gir en risiko.
Returverdi tomrompekeren (void *). Hvis tildelingen lykkes, returneres en peker til minnesblokken. Hvis tildelingen av minne mislykkes, returneres en NULL-peker. tomrompekeren (void *). Hvis tildelingen lykkes, returneres en peker til minnesblokken. Hvis tildelingen av minne mislykkes, returneres en NULL-peker.

Innhold: calloc vs malloc

  • 1 syntaks og eksempler
    • 1,1 malloc ()
    • 1,2 calloc ()
  • 2 Video som forklarer Calloc, Malloc og Realloc
  • 3 Sikkerhetshensyn
  • 4 Utførelseshastighet
  • 5 referanser

Syntaks og eksempler

malloc ()

void * malloc (size_t størrelse); 

Tildeler størrelse byte av minne. Hvis tildelingen lykkes, returneres en peker til det tildelte minnet. Ellers NULL returneres. Eksempel:

/ * Tillat minne for en matrise med 15 elementer av typen int. * / int * ptr = malloc (15 * sizeof (int)); hvis (ptr == NULL) / * Minne kunne ikke tildeles, så skriv ut en feil og avslutt. * / fprintf (stderr, "Kunne ikke allokere minne \ n"); exit (EXIT_FAILURE);  / * Allokering lyktes. * / 

Noter det malloc krever at vi beregner de bytes minne vi trenger, og send det som et argument til malloc.

calloc ()

void * calloc (size_t nelements, size_t bytes); 

tildeler en sammenhengende blokk med minne som er stort nok til å holde nelements av størrelse byte Hver. Den tildelte regionen initialiseres til null. I eksemplet ovenfor:

/ * Tillat plass til en matrise med 15 elementer av typen int og initialiser til nuller. * / int * ptr = calloc (15, sizeof (int)); hvis (ptr == NULL) / * Minne kunne ikke tildeles, så skriv ut en feil og avslutt. * / fprintf (stderr, "Kunne ikke allokere minne \ n"); exit (EXIT_FAILURE);  / * Allokering lyktes. * / 

calloc (m, n) er det samme som

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

Video som forklarer Calloc, Malloc og Realloc

Denne videoopplæringen forklarer minneallokeringsfunksjoner malloc, calloc og realloc, så vel som minneavdelingsfunksjonen gratis:

Sikkerhetshensyn

Det er vanligvis en god ide å bruke calloc over malloc. Når du bruker malloc, er innholdet i det tildelte minnet uforutsigbart. Programmeringsfeil kan føre til at disse innholdene i minnet lekker på utilsiktede, men svært sårbare måter. Et godt eksempel på en slik lekkasje er Heartbleed sårbarheten i OpenSSL, den grunnleggende mekanismen som er forklart i denne XKCD-tegneserien, og noen flere tekniske detaljer er i dette blogginnlegget.

Hastighet for utførelse

calloc er en liten bit tregere enn malloc på grunn av det ekstra trinnet med å initialisere minnet regionen tildelt. I praksis er forskjellen i fart imidlertid svært liten og kan ignoreres.

referanser

  • calloc man side
  • malloc man side