calloc vs. malloc

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.

Sammenligningstabel

Forskelle - ligheder - calloc versus malloc sammenligning diagram
callocmalloc
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.

Indhold: calloc vs. malloc

  • 1 Syntaks og eksempler
    • 1,1 malloc ()
    • 1.2 calloc ()
  • 2 Video, der forklarer Calloc, Malloc og Realloc
  • 3 Sikkerhedshensyn
  • 4 Udførelseshastighed
  • 5 Referencer

Syntaks og eksempler

malloc ()

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.

calloc ()

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

Video, der forklarer Calloc, Malloc og Realloc

Denne videovejledning forklarer hukommelsesallokeringsfunktioner malloc, calloc og realloc, såvel som hukommelsesuddelingsfunktionen gratis:

Sikkerhedshensyn

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.

Hurtighed af udførelse

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.

Referencer

  • calloc mand side
  • malloc mand side