Hvornår calloc bruges til at tildele en hukommelsesblok, det tildelte område initialiseres til nuller. I modsætning, malloc rører ikke indholdet i den tildelte hukommelsesblok, hvilket betyder, at den indeholder affaldsværdier. Dette kan potentielt være en sikkerhedsrisiko, fordi hukommelsens indhold er uforudsigeligt, og programmeringsfejl kan resultere i lækage af dette indhold.
calloc | malloc | |
---|---|---|
Fungere | tildeler en hukommelsesregion, der er stor nok til at indeholde "n elementer" af "størrelse" -byte hver. Initialiserer også hukommelsens indhold til nuller. | tildeler "størrelse" byte af hukommelse. |
Antal argumenter | 2 | 1 |
Syntaks | tomrum * calloc (nummer_of_blocks, størrelse_of_each_block_in_bytes); | tomrum * malloc (størrelse_in_bytes); |
Indholdet af den tildelte hukommelse | Den tildelte region initialiseres til nul. | Indholdet af den tildelte hukommelse ændres ikke. dvs. hukommelsen indeholder uforudsigelige værdier eller affaldsværdier. Dette udgør en risiko. |
Returværdi | void pointer (void *). Hvis tildelingen lykkes, returneres en markør til hukommelsesblokken. Hvis allokering af hukommelse mislykkes, returneres en NULL-markør. | void pointer (void *). Hvis tildelingen lykkes, returneres en markør til hukommelsesblokken. Hvis allokering af hukommelse mislykkes, returneres en NULL-markør. |
tomrum * malloc (størrelse_t størrelse);
allokerer størrelse
bytes af hukommelse. Hvis tildelingen lykkes, returneres en markør til den tildelte hukommelse. Ellers NUL
returneres. Eksempel:
/ * Tildel hukommelse til en matrix med 15 elementer af typen int. * / int * ptr = malloc (15 * størrelse af (int)); hvis (ptr == NULL) / * Hukommelse ikke kunne tildeles, så udskriv en fejl og afslutt. * / fprintf (stderr, "Kunne ikke allokere hukommelse \ n"); exit (EXIT_FAILURE); / * Tildeling lykkedes. * /
Noter det malloc
kræver, at vi beregner de bytes, som vi har brug for, og overfører det som et argument til malloc.
tomrum * calloc (størrelse_t nelementer, størrelse_ byte);
tildeler en sammenhængende blok hukommelse, der er stor nok til at indeholde nelements
af størrelse bytes
hver. Den tildelte region initialiseres til nul. I ovenstående eksempel:
/ * Tildel plads til en matrix med 15 elementer af typen int og initialiser til nul. * / int * ptr = calloc (15, størrelse af (int)); hvis (ptr == NULL) / * Hukommelse ikke kunne tildeles, så udskriv en fejl og afslutt. * / fprintf (stderr, "Kunne ikke allokere hukommelse \ n"); exit (EXIT_FAILURE); / * Tildeling lykkedes. * /
calloc (m, n) er det samme som
p = malloc (m * n); hvis (p) memset (p, 0, m * n);
Denne videovejledning forklarer hukommelsesallokeringsfunktioner malloc
, calloc
og realloc
, såvel som hukommelsesuddelingsfunktionen gratis
:
Det er generelt en god ide at bruge calloc
over malloc
. Når du bruger malloc, er indholdet af den tildelte hukommelse uforudsigeligt. Programmeringsfejl kan forårsage, at dette hukommelsesindhold lækker på utilsigtede, men meget sårbare måder. Et godt eksempel på en sådan lækage er Heartbleed-sårbarheden i OpenSSL, hvis grundlæggende mekanisme er forklaret i denne XKCD-tegneserie, og nogle flere tekniske detaljer findes i dette blogindlæg.
calloc er en lille smule langsommere end malloc på grund af det ekstra trin med at initialisere den tildelte hukommelsesregion. Imidlertid er forskellen i hastighed i praksis meget lille og kan ignoreres.