A malloc () és a calloc () függvények megértése előtt először meg kell értenünk a dinamikus memóriaelosztás jelentését. A memória elosztása a számítógép memóriájának a programok és folyamatok végrehajtásához történő hozzárendelése. Dinamikus elosztási technikákat használunk, ha nem ismert, hogy mennyi memória szükséges a programhoz és a folyamathoz.
A dinamikus memóriaelosztás a statikus memóriaelosztással kapcsolatos problémák miatt keletkezik, például ha kevesebb elemet tárolunk, akkor a többi memória feleslegesen pazarolódik. Ezért leküzdi a statikus memóriaelosztás problémáit, ahol a memóriát csak akkor kell kiosztani, ha szükséges.
Összehasonlító táblázat
Az összehasonlítás alapja | malloc () | calloc () |
---|---|---|
A blokkok száma | Az igényelt memória egyetlen blokkját hozzárendeli. | Több blokkot rendel a kért memóriához. |
Szintaxis | void * malloc (size_t méret); | void * calloc (size_t szám, size_t méret); |
inicializálás | A malloc () nem törli és inicializálja a hozzárendelt memóriát. | A hozzárendelt memória nullára inicializálódik a calloc () használatával. |
A kiosztás módja | A malloc () függvény a "méret" méretű memóriát osztja fel a kupacról. | calloc () függvény osztja a memóriát, amelynek mérete a num * méretnek felel meg. |
Sebesség | Gyors | Összehasonlítóan lassú. |
A malloc meghatározása ()
A malloc függvény egy memória blokkot bájtban rendel. A felhasználónak kifejezetten meg kell adnia a blokk méretét, ami a használathoz szükséges.
A malloc függvényprogram segítségével a rendszer RAM-ját kéri a memória felosztására, ha a kérést elismerték (azaz a malloc funkció sikeresen osztja fel a memóriát), akkor egy mutatót ad vissza az első memóriablokkra. Visszaadja az érvénytelen típusú mutatót, vagyis bármilyen típusú mutatót rendelhet.
Bár NULL-t ad vissza, ha a malloc funkciók nem képesek a szükséges mennyiségű memóriát kiosztani. A malloc funkció a TURBO C, a alloc.h
vagy a stdlib.h
fejléc fájlban alloc.h
el, UNIX-on pedig a fejléc fájlban lesz elérhető .
SZINTAXIS
Ennek a funkciónak a szintaxisa a következő:
malloc(number of elements * size of each element);
például, int *ptr;
ptr=malloc(10*sizeof (int))
Ahol a méret a bájtban szükséges memória méretét jelenti (azaz a hozzárendelendő egymás melletti memóriahelyek számát).
De mint már említettük, a malloc függvény visszavon egy üres mutatót, következésképpen egy leadott operátornak szüksége van arra, hogy szükség esetén módosítsa a visszajuttatott mutatót, a fenti nyilatkozatot a következő formában lehet bemutatni:
ptr_var=(type_cast* ) malloc (size)
Ahol a ptr_var
az a mutató neve, amely megtartja a hozzárendelt memóriablokk kiindulási címét, a type_cast
az az adattípus, amelybe a visszajuttatott mutatót (vagy típust) kell átalakítani, és a méret leírja az elosztott memóriablokk méretét bájtokban .
Például: int *ptr;
ptr=(int*) malloc (10 * size of (int));
A malloc funkció által kiosztott memória a szemétértéket tartalmazza .
Megjegyzendő, hogy ellenőrizze, hogy ha a malloc a megfelelő kérelmet generálja-e a rendszer RAM által biztosított memória elosztására, vagy elutasítja (amennyiben nem szükséges a hely). Használhatjuk azt a tulajdonságot, amelyben a szükséges memóriamennyiség nincs hozzárendelve a malloc függvényhez egy NULL értéket ad vissza.
A calloc meghatározása ()
A calloc függvény pontosan ugyanaz, mint a malloc függvény, azzal a különbséggel, hogy két argumentumot igényel, mint a malloc () esetében csak egy érv szükséges.
Például: int*ptr;
ptr = (int*)calloc(10, 2);
Itt a 2 az adattípus méretét egy bájtban határozza meg, amelyre az elosztást kívánjuk elvégezni, ami ebben az esetben az egész számokra 2. A 10 pedig azt az elemet jelöli, amelyre a kiosztást el kell végezni.
Ne feledje, hogy a malloc függvénynek átadott argumentum (n * 10), egyetlen érv nem keverhető össze, mert több argumentum vesszővel elválasztva. Az argumentum (n * 10) nem tartalmaz vesszőt. Ezért ez egyetlen érv, bár nem egyszerű, hanem kifejezés.
Visszatérve a fenti nyilatkozathoz, a fenti utasítás végrehajtását követően 20 bájtos memóriablokk van hozzárendelve a kérő programhoz, és az első blokk címe hozzárendelésre kerül a kérő programhoz, és az első mondat címe hozzá van rendelve a mutatóhoz ptr.
A calloc funkció által kiosztott memória minden nullát tartalmaz. A calloc függvény a fejléc fájlban is elérhető vagy
a TURBO C.
A malloc és a calloc közötti különbségek
A malloc és a calloc funkciók közötti elsődleges különbségek a következők:
- A malloc-ban a kívánt memória egyetlen blokkja van, míg a kért memória több blokkját a calloc hozzárendeli.
- A malloc funkció nem törli és nem inicializálja a hozzárendelt memóriát. Ez tartalmaz szemétértéket, és az elosztott memória elemét nem lehet megváltoztatni. Ezzel ellentétben a calloc inicializálja a hozzárendelt memóriát nullára.
- A malloc gyorsabb, mint a calloc, mivel a calloc-ban további inicializálási lépésekre van szükség, de a különbség elhanyagolható.
- A két másik különbség, hogy a calloc egy malloc + memeet, a memset a fizikai oldalakat a memóriában osztja el, míg a malloc a memóriát csak a virtuális címben lévő halomból hozza.
Következtetés:
Mind a malloc, mind a calloc függvényeket a memória elosztására használják, és bizonyos előnyökkel rendelkeznek, és a malloc hátránya gyors, mint a calloc. Sőt, a malloc könnyebben használható, mivel csak egy argumentumot vesz igénybe, mert a calloc memóriát oszt meg és inicializálja a ZERO memóriaterületet. De ha a változó inicializálása sokkal fontosabb az Ön számára, inkább calloc-ot használ.