szó jelentését keresi. A DICTIOUS-ban nem csak a
szó összes szótári jelentését megtalálod, hanem megismerheted az etimológiáját, a jellemzőit és azt is, hogyan kell a
szót egyes és többes számban mondani. Minden, amit a
szóról tudni kell, itt található. A
szó meghatározása segít abban, hogy pontosabban és helyesebben fogalmazz, amikor beszélsz vagy írsz. A
és más szavak definíciójának ismerete gazdagítja a szókincsedet, és több és jobb nyelvi forráshoz juttat.
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
malloc
megkeresi 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 * 10;
}
for (int i = 0; i < n; i++) {
printf("%d ", tomb);
}
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
, free
segí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üntetni free
-vel, különben memóriaszivárgás lép fel.
- NULL ellenőrzés: Mindig ellenőrizd, hogy a
malloc
visszatért-e sikeresen, azaz nem adott-e vissza NULL
-t.
- Pointer típusok kezelése: A
malloc
void*
-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
calloc
függvényt, vagy memset
-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
malloc
NULL-t ad vissza.
- Lehetőleg használj
sizeof
operá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
calloc
biztonsá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
malloc
a 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
és realloc
, együtt alkotja a hatékony memóriakezelést.