kallokas ir mallokas

Kada kallokas yra naudojamas atminties blokui paskirstyti, paskirstytas regionas yra inicializuojamas į nulį. Priešingai, mallokas neliečia priskirto atminties bloko turinio, o tai reiškia, kad jame yra šiukšlių vertės. Tai gali sukelti pavojų saugumui, nes atminties turinys yra nenuspėjamas, o programavimo klaidos gali išpūsti šį turinį.

Palyginimo diagrama

Skirtumai - panašumai - kalloko ir malloko palyginimo lentelė
kallokasmallokas
Funkcija skiria pakankamai didelę atminties sritį, kad kiekvienas galėtų laikyti „n“ elementus „dydžio“ baitais. Taip pat inicijuoja atminties turinį iki nulio. skiria „dydžio“ atminties baitus.
Argumentų skaičius 2 1
Sintaksė void * calloc (skaičius_blokų, dydis_papildomas_blokuoti_inbaitų); void * malloc (dydis_in_bytes);
Paskirtosios atminties turinys Paskirtas regionas inicializuojamas iki nulio. Paskirtos atminties turinys nekeičiamas. y., atmintyje yra nenuspėjamų ar šiukšlių verčių. Tai kelia riziką.
Grąžinimo vertė void rodyklė (void *). Jei paskirstyti pavyksta, rodiklis į atminties bloką grąžinamas. Jei atminties paskirstyti nepavyksta, grąžinamas žymeklis NULL. void rodyklė (void *). Jei paskirstyti pavyksta, rodiklis į atminties bloką grąžinamas. Jei atminties paskirstyti nepavyksta, grąžinamas žymeklis NULL.

Turinys: kallokas ir mallokas

  • 1 Sintaksė ir pavyzdžiai
    • 1.1 „malloc“ ()
    • 1,2 kallokas ()
  • 2 Vaizdo įrašas, paaiškinantis „Calloc“, „Malloc“ ir „Realloc“
  • 3 Saugumo sumetimai
  • 4 Vykdymo greitis
  • 5 literatūros sąrašas

Sintaksė ir pavyzdžiai

malloc ()

void * malloc (dydis_t dydis); 

skiria dydis baitų atminties. Jei paskirstymas pavyksta, rodyklė į paskirtą atmintį grąžinama. Kitaip NULL yra grąžinamas. Pavyzdys:

/ * Skirkite atmintį masyvui su 15 tipo elementų int. * / int * ptr = malloc (15 * dydisof (int)); if (ptr == NULL) / * Atmintis negalėjo būti paskirta, todėl atsispausdinkite klaidą ir išeikite. * / fprintf (stderr, "Nepavyko paskirstyti atminties \ n"); išėjimas (EXIT_FAILURE);  / * Paskirstymas pavyko. * / 

Prisimink tai mallokas reikalauja, kad mes apskaičiuotume reikalingus atminties baitus ir perduotume tai kaip argumentą malloc.

kallokas ()

void * calloc (dydis_t nelegalai, dydis_t baitai); 

skiria gretimą atminties bloką, kurio dydis yra pakankamai didelis nelegalai dydžio baitų kiekviena. Paskirtas regionas inicializuojamas iki nulio. Aukščiau pateiktame pavyzdyje:

/ * Skirkite vietos masyvui su 15 tipo elementų int ir inicijuokite iki nulio. * / int * ptr = calloc (15, dydisof (int)); if (ptr == NULL) / * Atmintis negalėjo būti paskirta, todėl atsispausdinkite klaidą ir išeikite. * / fprintf (stderr, "Nepavyko paskirstyti atminties \ n"); išėjimas (EXIT_FAILURE);  / * Paskirstymas pavyko. * / 

kallokas (m, n) yra toks pat kaip

p = mallokas (m * n); if (p) memset (p, 0, m * n); 

Vaizdo įrašas, paaiškinantis „Calloc“, „Malloc“ ir „Realloc“

Šiame vaizdo įrašo vadove paaiškintos atminties paskirstymo funkcijos mallokas, kallokas ir realloc, taip pat atminties paskirstymo funkcija Laisvas:

Saugumo sumetimai

Paprastai gera idėja naudoti kallokas per mallokas. Kai naudojate „malloc“, paskirtos atminties turinys nenuspėjamas. Programavimo klaidų dėka šis atminties turinys gali nutekėti netyčia, tačiau labai pažeidžiamas. Geras tokio nutekėjimo pavyzdys yra „Openble“ pažeidžiamumas „Heartbleed“, kurio pagrindinis mechanizmas paaiškintas šiame XKCD komikse, o dar keletas techninių duomenų yra šiame tinklaraščio įraše..

Vykdymo greitis

„calloc“ yra šiek tiek lėtesnis nei „malloc“ dėl papildomo priskirtos atminties srities inicijavimo žingsnio. Tačiau praktikoje greičio skirtumas yra labai mažas ir jo galima nepaisyti.

Nuorodos

  • kallokas vyro puslapis
  • mallokas vyro puslapis