kalloc vs malloc

Amikor calloc a memória blokkjának kiosztására szolgál, az allokált régiót nullára inicializálják. Ellentétben, malloc nem érinti a kiosztott memóriablokk tartalmát, azaz szemétértékeket tartalmaz. Ez potenciálisan biztonsági kockázatot jelenthet, mivel a memória tartalma kiszámíthatatlan, és a programozási hibák ezen tartalmak szivárgását eredményezhetik..

Összehasonlító táblázat

Különbségek - hasonlóságok - kalloc versus malloc összehasonlító táblázat
callocmalloc
Funkció a memória egy olyan területét foglalja el, amely elég nagy ahhoz, hogy mindegyik "méret" bájt "n elemet" tárolja. A memória tartalmát nullára inicializálja. kiosztja a "méret" bájt memóriát.
Az érvek száma 2 1
Szintaxis void * calloc (blokkok száma ,________blokk_in_bytes__________] void * malloc (size_in_bytes);
A kiosztott memória tartalma A kiosztott régiót nullára inicializálják. A kiosztott memória tartalma nem változik. azaz a memória kiszámíthatatlan vagy szemétértékeket tartalmaz. Ez kockázatot jelent.
Visszatérési érték void mutató (void *). Ha az allokáció sikeres, a memóriablokkra mutató mutató visszatér. Ha a memória kiosztása sikertelen, akkor egy NULL mutató kerül vissza. void mutató (void *). Ha az allokáció sikeres, a memóriablokkra mutató mutató visszatér. Ha a memória kiosztása sikertelen, akkor egy NULL mutató kerül vissza.

Tartalom: kalloc vs malloc

  • 1 Szintaxis és példák
    • 1.1 malloc ()
    • 1,2 kalloc ()
  • 2 Videó a Calloc, Malloc és Realloc ismertetéséről
  • 3 Biztonsági szempontok
  • 4 A végrehajtás sebessége
  • 5 Hivatkozások

Szintaxis és példák

malloc ()

void * malloc (méret_t méret); 

kiosztja méret bájt memória. Ha a kiosztás sikeres, akkor a kiosztott memória mutatója visszatér. Másképp NULLA visszatér. Példa:

/ * Helyezzen el memóriát egy 15 típusú elemmel rendelkező tömb számára int. * / int * ptr = malloc (15 * méret (int)); if (ptr == NULL) / * A memória nem volt lefoglalható, tehát nyomtasson ki egy hibát, és lépjen ki. * / fprintf (stderr, "Nem lehet elosztani a memóriát \ n"); exit (EXIT_FAILURE);  / * Az allokáció sikeres volt. * / 

Vegye figyelembe, hogy malloc megköveteli, hogy kiszámítsuk a szükséges memória bájtjait, és ezt érvelésként továbbítsuk a malloc számára.

calloc ()

void * calloc (méret_táblázat, méret_t bájt); 

a szomszédos memória blokkot allokálja, amely elég nagy ahhoz, hogy elférjen nelements méretű bájt minden egyes. A kiosztott régiót nullára inicializálják. A fenti példában:

/ * Helyet foglaljon el egy 15 típusú elemmel rendelkező tömb számára int és nullára inicializálja. * / int * ptr = calloc (15, méret (int)); if (ptr == NULL) / * A memória nem volt lefoglalható, tehát nyomtasson ki egy hibát, és lépjen ki. * / fprintf (stderr, "Nem lehet elosztani a memóriát \ n"); exit (EXIT_FAILURE);  / * Az allokáció sikeres volt. * / 

kallok (m, n) megegyezik a

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

Videó, amely elmagyarázza a Calloc, Malloc és Realloc videókat

Ez a videó bemutató ismerteti a memóriaelosztási funkciókat malloc, calloc és realloc, valamint a memória kiosztási funkciója ingyenes:

Biztonsági megfontolások

Általában jó ötlet használni calloc felett malloc. Malloc használatakor a kiosztott memória tartalma kiszámíthatatlan. A programozási hibák miatt ezek a memóriatartalmak nem kívánt, de nagyon érzékeny módon szivároghatnak. Jó példa erre a szivárgásra az OpenSSL Heartbleed sebezhetősége, amelynek alapvető mechanizmusát az XKCD képregény ismerteti, és néhány további technikai részlet ebben a blogbejegyzésben található..

A végrehajtás sebessége

A calloc egy kicsit lassabb, mint a malloc, mivel a memóriaterület inicializálásának további lépése van. A gyakorlatban azonban a sebességbeli különbség nagyon kicsi, és figyelmen kívül hagyható.

Irodalom

  • calloc férfi oldal
  • malloc férfi oldal