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..
calloc | malloc | |
---|---|---|
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. |
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.
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);
Ez a videó bemutató ismerteti a memóriaelosztási funkciókat malloc
, calloc
és realloc
, valamint a memória kiosztási funkciója ingyenes
:
Á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 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ó.