A malloc() és a calloc() közötti különbség
Főbb különbségek a malloc() és a calloc() között
- A malloc() függvény csak a kezdőcímet adja vissza, és nem nullázza ki, másrészt a calloc() függvény visszaadja a kezdőcímet és nullává teszi.
- A malloc függvényben az argumentumok száma 1, míg a calloc függvényben az argumentumok száma 2.
- A malloc() időhatékonysága magasabb, mint a calloc(), míg a malloc() nem biztonságos a calloc()-hoz képest
- A malloc nem inicializálja a memóriát, míg a calloc végrehajtja a memória inicializálását.
Mi az a dinamikus memóriafoglalás?
Dinamikus memóriafoglalás a memória lefoglalásának folyamata futási időben. Négy könyvtári rutin létezik: calloc(), free(), realloc(), és malloc(), amelyek segítségével memória foglalható le és szabadul fel a program végrehajtása során. Ezeket a rutinokat az stdlib.h nevű fejlécfájl határozza meg.
Mi az a malloc()?
Ez egy memóriablokk dinamikus lefoglalására szolgáló funkció. Meghatározott méretű memóriaterületet foglal le, és visszaadja a memóriahelyre mutató nullmutatót.
A visszaadott mutató általában void típusú. Ez azt jelenti, hogy bármely mutatóhoz hozzárendelhetünk malloc függvényt. A malloc teljes formája a memóriafoglalás.
Mi az a calloc()?
Calloc() függvény több memóriablokk lefoglalására szolgál. Ez egy dinamikus memóriafoglalási funkció, amely a memória komplex adatstruktúrákhoz, például tömbökhöz és struktúrákhoz való hozzárendelésére szolgál. Ha ez a függvény nem tud elegendő helyet lefoglalni a megadottak szerint, nulla mutatót ad vissza. A calloc függvény teljes formája a szomszédos allokáció.
A malloc() és a calloc() közötti különbség
Itt vannak fontos különbségek a malloc () és a calloc () között:
malloc () | calloc() |
---|---|
A Malloc() függvény egyetlen, a felhasználó által megadott méretű memóriablokkot hoz létre. | A Calloc() függvény több memóriablokkot is hozzárendelhet egy változóhoz. |
A Malloc függvény szemetet tartalmaz. | A calloc függvény által lefoglalt memóriablokk mindig nullára inicializálódik. |
Az argumentumok száma 1. | Az argumentumok száma 2. |
A Calloc lassabb, mint a malloc. | A Malloc gyorsabb, mint a calloc. |
A calloc-hoz képest nem biztonságos. | A mallochoz képest biztonságos a használata. |
Az időhatékonyság nagyobb, mint a calloc(). | Az időhatékonyság alacsonyabb, mint a malloc(). |
A Malloc() függvény csak a kezdőcímet adja vissza, és nem nullázza azt. | A cím kiosztása előtt a Calloc() függvény visszaadja a kezdőcímet, és nullává teszi. |
Nem végzi el a memória inicializálását. | A memória inicializálását végzi. |
malloc() szintaxisa
Itt van a malloc() szintaxisa
ptr = (cast_type *) malloc (byte_size);
A fenti szintaxisban a ptr egy cast_type mutató. A malloc függvény egy mutatót ad vissza a byte_size lefoglalt memóriájába.
Example: ptr = (int *) malloc (50)
Ha ez az utasítás sikeresen végrehajtódik, 50 bájtos memóriaterület kerül lefoglalásra. A lefoglalt terület első bájtjának címe az int típusú „ptr” mutatóhoz van hozzárendelve.
A calloc() szintaxisa
Itt van a malloc() szintaxisa
ptr = (cast_type *) calloc (n, size);
A fenti szintaxis n azonos méretű memóriablokk lefoglalására szolgál. A memóriaterület lefoglalása után az összes bájt nullára inicializálódik. A mutató, amely jelenleg a lefoglalt memóriaterület első bájtjánál van, visszakerül.
Példa a malloc()-ra C-ben
Az alábbi kódban a sizeof(*ptr) egy 15 egész számból álló memóriablokk lefoglalására szolgál. A printf utasításban megtaláljuk a 6. egész szám értékét.
#include<stdlib.h> #include<stdio.h> int main(){ int *ptr; ptr = malloc(15 * sizeof(*ptr)); if (ptr != NULL) { *(ptr + 5) = 480; printf("Value of the 6th integer is %d",*(ptr + 5)); } }
output:
A 6. egész szám értéke 480
Példa a calloc()-ra C-ben
Az alábbi C nyelvű program az első tíz tag összegét számítja ki. Ha a mutató értéke null, akkor a memóriaterület nem kerül lefoglalásra.
A For ciklus egy „i” változó értékének iterálására és az összeg kinyomtatására szolgál. Végül a function free a mutató felszabadítására szolgál.
#include <stdio.h> #include <stdlib.h> int main() { int i, * ptr, sum = 0; ptr = calloc(10, sizeof(int)); if (ptr == NULL) { printf("Error! memory not allocated."); exit(0); } printf("Building and calculating the sequence sum of the first 10 terms \n"); for (i = 0; i < 10; ++i) { * (ptr + i) = i; sum += * (ptr + i); } printf("Sum = %d", sum); free(ptr); return 0; }
output:
Az első 10 tag sorozatösszegének felépítése és kiszámítása n Sum = 45
Miért használja a malloc()-t?
Íme a malloc() használatának okai
- Használja a malloc()-ot, ha futás közben memóriát kell lefoglalnia.
- A malloc-ot akkor kell használnia, ha olyan objektumokat kell lefoglalnia, amelyeknek az aktuális memóriablokk végrehajtásán túl kell létezniük.
- Ha a verem méreténél nagyobb memóriát kell lefoglalnia, válassza a malloc() parancsot.
- Visszaadja a mutatót a lefoglalt terület első bájtjára.
- Lehetővé teszi a fejlesztők számára, hogy a szükséges memóriát a pontos mennyiségben lefoglalják.
- Ez a funkció egy bájtnyi memóriablokkot foglal le a kupacból.
Miért használjuk a calloc()-t?
Íme a calloc() használatának okai
- Amikor a lefoglalt memóriát nullára kell állítani.
- Használhatja a calloc-ot, amely egy mutatót ad vissza, hogy hozzáférjen a memóriakupachoz.
- Akkor használatos, amikor az elemeket nullára kell inicializálni, hogy a mutatót visszaadja a memóriába.
- A malloc() által lehetséges túlcsordulás elkerülése érdekében
- A calloc() segítségével olyan oldalt kérhet, amelyről ismert, hogy már nullázva van.