malloc
Főnév
malloc (tsz. mallocs)
- (informatika) A C programozási nyelv egyik kulcsfontosságú eleme a dinamikus memóriafoglalás, amely lehetővé teszi, hogy futásidőben foglaljunk memóriát a program számára, ahelyett, hogy csak fix méretű statikus vagy automatikus (stack) memóriát használnánk.
A dinamikus memóriafoglalás legfontosabb eszköze a malloc függvény, amely az angol “memory allocation” (memóriafoglalás) kifejezés rövidítése.
Mi az a malloc?
A malloc egy C standard könyvtári függvény, amely a <stdlib.h> fejléccel érhető el. Feladata, hogy a futó program halmazán (heap) lefoglaljon egy adott méretű memóriaterületet, és visszaadjon egy mutatót az így lefoglalt terület kezdőcímére.
Függvény prototípusa:
void *malloc(size_t size);
- size: a lefoglalni kívánt memória mérete bájtban.
- A visszatérési érték egy
void *típusú mutató, amely a lefoglalt memória kezdőcímére mutat. - Ha a foglalás sikertelen (például kevés a szabad memória), akkor
NULL-t ad vissza.
Miért fontos a malloc?
- Rugalmas memóriahasználat: Ha nem ismert előre a program futása előtt, hogy mennyi memóriára lesz szükség, a dinamikus foglalással futás közben tudjuk ezt kezelni.
- Nagy adatok kezelése: Például nagy tömbök vagy komplex adatstruktúrák, melyek mérete futásidőben változhat.
- Memóriahatékonyság: Csak akkor foglalunk, amikor tényleg szükség van rá, nem előre.
Hogyan működik a malloc?
- A program futása közben a halmaz területén a
mallocmegkeresi az első szabad, megfelelő méretű memóriablokkot. - Lefoglalja ezt a memóriaterületet, azaz megjelöli, hogy azt már nem szabad másnak kiosztani.
- Visszaadja a blokk kezdőcímét mutató pointert, amit a program később használhat.
A lefoglalt memóriaterület nem inicializált, azaz benne bármilyen érték lehet (garbage). Ezért használat előtt gyakran szükséges a tartalom nullázása vagy más inicializálás.
Példa malloc használatára
#include <stdio.h>
#include <stdlib.h>
int main() {
int n;
printf("Add meg a tomb meretet: ");
scanf("%d", &n);
int *tomb = (int*) malloc(n * sizeof(int));
if (tomb == NULL) {
fprintf(stderr, "Memoriafoglalasi hiba!\n");
return 1;
}
for (int i = 0; i < n; i++) {
tomb[i] = i * 10;
}
for (int i = 0; i < n; i++) {
printf("%d ", tomb[i]);
}
printf("\n");
free(tomb); // fontos a memória felszabadítása
return 0;
}
Ebben a példában a program lefoglal egy egész típusú tömböt a malloc-kal a felhasználó által megadott mérettel, feltölti és kiírja az elemeket.
malloc vs. statikus és automatikus memóriafoglalás
- Statikus memória: A fordítási időben lefoglalt memória (pl. globális változók, statikus lokális változók). Mérete fix, a program futása alatt állandó.
- Automatikus memória: A függvények lokális változói, melyek a veremben (stack) jönnek létre, és a függvény visszatérésekor megsemmisülnek.
- Dinamikus memória: A halmazon (heap) futás közben foglalt memória, amit a program maga kezeli
malloc,calloc,realloc,freesegítségével.
A dinamikus memória előnye, hogy mérete futásidőben változtatható, és a program addig használhatja, ameddig akarja, nem kötött a függvények életciklusához.
Fontos szabályok a malloc használatakor
- Memória felszabadítása: Minden
malloc-kal lefoglalt memória blokkot meg kell szüntetnifree-vel, különben memóriaszivárgás lép fel. - NULL ellenőrzés: Mindig ellenőrizd, hogy a
mallocvisszatért-e sikeresen, azaz nem adott-e visszaNULL-t. - Pointer típusok kezelése: A
mallocvoid*-ot ad vissza, amely bármilyen mutatóvá konvertálható. A C-ben a konverzió implicit, de sok programozó explicit típuskonverziót használ. - Foglalt memória inicializálása: A lefoglalt memória tartalma véletlenszerű, ezért ha nullázni akarjuk, használhatjuk a
callocfüggvényt, vagymemset-tel állíthatjuk be. - Buffer overflow elkerülése: Ügyelj, hogy ne lépd túl a lefoglalt méretet.
További hasznos malloc-hoz kapcsolódó függvények
- calloc: A
malloc-hoz hasonló, de a lefoglalt memóriát nullával inicializálja.
void *calloc(size_t nmemb, size_t size);
- realloc: Egy már lefoglalt memória blok méretét módosítja, újraméretezi.
void *realloc(void *ptr, size_t size);
Például ha növelni szeretnénk egy tömb méretét, akkor realloc-ot használunk.
Hogyan kezeli az operációs rendszer a malloc hívásokat?
A malloc általában nem közvetlenül az operációs rendszerből kér memóriát minden egyes híváskor, mert az operációs rendszer memóriakezelése (például brk, sbrk, vagy mmap Linux alatt) viszonylag lassú. Ehelyett a malloc egy belső memóriakezelő algoritmust használ, amely:
- Nagyobb memóriablokkokat kér az OS-től egyszerre.
- Ezután ezeket darabolja kisebb darabokra, és osztja ki a program számára.
- Amikor a memória már nem kell, visszaadhatja az OS-nek, vagy később újra felhasználhatja.
Példák hibákra malloc használatakor
- Memóriaszivárgás: Ha nem szabadítod fel a lefoglalt memóriát, a program egyre több memóriát fog használni.
- Dupla felszabadítás: Két vagy több alkalommal próbálod felszabadítani ugyanazt a memóriaterületet.
- Nem ellenőrzött malloc visszatérés: Ha nem ellenőrzöd a
NULL-t, és tovább használod, a program összeomolhat. - Buffer overflow: Ha a lefoglalt méreten túl indexelsz.
Gyakorlati tippek malloc használatához
- Mindig írd ki a hibaüzenetet, ha
mallocNULL-t ad vissza. - Lehetőleg használj
sizeofoperátort a típus helyett, így könnyen módosítható a típus anélkül, hogy hibázol a méretben:
int *ptr = malloc(n * sizeof *ptr);
- A
callocbiztonságosabb lehet, mert nullázza a memóriát. - Használj memóriaszivárgás-ellenőrző eszközöket (pl. Valgrind), hogy kiszűrd a problémákat.
- Írj segédfüggvényeket, például
xmalloc, amely kilép hibával, ha a foglalás sikertelen.
Összefoglaló
- A
malloca dinamikus memóriafoglalás alapja C-ben. - Lefoglal futás közben egy megadott méretű memóriaterületet, visszaadva annak címét.
- Fontos a lefoglalt memória felszabadítása, valamint a visszatérési érték ellenőrzése.
- Nem inicializálja a lefoglalt memóriát, ezért használata előtt figyelni kell erre.
- Más függvényekkel, mint
callocésrealloc, együtt alkotja a hatékony memóriakezelést.