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.
calloc | malloc | |
---|---|---|
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. |
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.
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);
Denne videoopplæringen forklarer minneallokeringsfunksjoner malloc
, calloc
og realloc
, så vel som minneavdelingsfunksjonen gratis
:
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.
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.