A MALLOC FUNKCIÓ HASZNÁLATA A C

How Use Malloc Function C



A Malloc a fejléc fájlban deklarált beépített függvény. A Malloc a „memóriakiosztás” rövid neve, és arra szolgál, hogy dinamikusan kioszthasson egyetlen nagy méretű, összefüggő memóriát a megadott méretnek megfelelően. A memóriakiosztásnak két típusa van: statikus és dinamikus. A statikus memóriakiosztás a fordítás idején történik, és nem változik futásidőben. A dinamikus memóriakiosztás a memória lefoglalása futásidőben ehhez; mi malloc -ot használunk. Most az a lényeg, hogy honnan származik ez a memória, tehát minden dinamikus követelmény C -ben teljesül a halom memóriából. Alapvetően alkalmazásunk/programunk 3 féle memóriával rendelkezik

  • A verem memória minden módszerhez lokális, és amikor a módszer visszatér, a verem automatikusan törli azt.
  • A globális memóriaterület kiosztja a memóriát az összes globális változó számára. Ez a memóriaterület a program elején jön létre, és a végén automatikusan törli a memóriaterületet.
  • A halom memória mindig ellenség, amely megfelel a program/alkalmazás minden dinamikus követelményének. Amikor a malloc függvényt fogjuk használni, kölcsönkér egy memóriát a halomból, és megadja nekünk a mutatót.

Szintaxis:







A malloc szintaxisa (void*) malloc (size_t size). Tehát a szintaxis azt mondja, hogy a malloc méretet igényel, alapvetően egy üres mutatót ad vissza, és a t méretet előjel nélküli egész számként határozzák meg. A Malloc függvény egyszerűen kioszt egy memóriablokkot a halomban megadott méretnek megfelelően, amint az a szintaxisban is látható, hogy a méretet meg kell adni, és a siker esetén visszaad egy mutatót, amely a kiosztott memória első bájtjára mutat, egyébként NULL . Tehát a malloc feladata a memória lefoglalása a futási időben.



Miért üres mutató:

Mallocnak fogalma sincs, mire mutat; ez egyszerűen azt jelenti, hogy nem tudja, milyen adatokat tárol az adott memóriahelyen. Csupán a felhasználó által kért memóriát foglalja le anélkül, hogy tudná, milyen típusú adatokat kell tárolni a memóriában. Ezért visszaad egy üres mutatót.



A Malloc csak ezt követően osztja ki a memóriát, és a felhasználó felelőssége, hogy a megfelelő típusú gépelést írja be, hogy az megfelelően használható legyen a programban. Az ürességmutató olyan mutató, amely bármilyen típusú adatot mutathat, a malloc üres mutatót ad vissza, mert nem tudja, hogy milyen típusú adatok kerülnek tárolásra a memóriában.





Itt azt kérjük a malloc -tól, hogy most foglaljon le 6 bájt memóriát, ha sikerrel jár, a malloc üres mutatót ad vissza. Ebben az esetben be kell írnunk egy egész típusú mutatóba, mert egy egész számot akarunk tárolni a memóriában. Itt a malloc 6 bájt memóriát foglal le egy halomban, és az első bájt címét a ptr mutató tárolja.



Példa program:

Íme egy egyszerű példaprogram a malloc fogalmának megfelelő megértéséhez.

Itt láthatja a printf függvénnyel, arra kérem a felhasználót, hogy adja meg az egész számok számát. Két változót deklaráltunk i és n fölött. Az n változó az a hely, ahol a felhasználó által megadott számot tároljuk. Ezt követően malloc függvényünk van; azt akarjuk, hogy a malloc n egész számnak megfelelő méretet rendeljen hozzá. Megszorozzuk a méretet, ha int és n; ez n egész szám nagyságú lesz. Ezt követően a malloc visszaad egy üres mutatót, és egész számmutatóba gépeljük, és a címet a ptr mutatóban tároljuk. A gépelés fontos, mivel jó gyakorlat.

Ha a mutató NULL értéket tartalmaz, ez azt jelenti, hogy a memória nem érhető el. Tehát egyszerűen kilépünk a programból a kilépési hiba állapotával. Ha ez nem így van, akkor könnyen futtathatjuk a ciklushoz.

A ciklus 0-tól n-1-ig fog futni, és minden alkalommal felkérjük a felhasználót, hogy egyenként írja be az egész számot. A scanf függvényen belül egy dolog van írva ptr+i, mivel tudjuk, hogy a ptr tartalmazza a memória első bájtjának címét. Tegyük fel, hogy a cím itt 1000, i kezdetben nulla, tehát 1000+0 1000, tehát ezen a címen belül az első egész számunk tárolódik, majd ezt követően, amikor i lesz 1, így 1000+1, amely belsőleg (1000) +1 *4 ha feltételezem, hogy az egész szám mérete 4 bájt, és egyenlő lenne 1004 -gyel, így a következő egész szám 1004 helyen belül lesz tárolva. És ez így folytatódik, a címek 1000, 1004, 1008 és így tovább. Nem használjuk az ampersand -ot a ptr+i előtt, mert a ptr már megadja nekünk a címet, amikor ptr -t írunk, ami egyszerűen egy mutató, és a címet tartalmazza, nem pedig az értéket, így nincs szükség arra, hogy előtte betűjel kerüljön, és ennek a fogalomnak világosnak kell lennie.

Itt ebben a ciklusban egyszerűen csak egy dolgot teszünk, és kinyomtatjuk az összes egész számot a képernyőn; nyilvánvalóan a ptr+i -t használjuk, de itt ebben az esetben lekapcsoljuk a hivatkozást, mert a ptr+i egy címet jelent, ezért el kell távolítanunk. Ha i egyenlő 0 -val, akkor 1000 lesz, mert feltételezzük, hogy az első cím 1000 lesz, tehát lecsatoljuk; megkapjuk az első egész számot, akkor i egyenlő 1 -gyel, és 1001 lesz, de 1004 -ként értelmezzük, ha az egész szám mérete 4. Ismét. Dereferenciázzuk, így megadjuk a 2 -tndegész szám. Ily módon minden működik.

Tehát ez alapvetően egy egyszerű program, amely arra kéri a felhasználókat, hogy írjanak be egész számot, majd egyszerűen megjelenítjük ezeket az egész számokat a képernyőn. A program végrehajtása után ez megjelenik.

Először arra kérjük a felhasználót, hogy adja meg az egész számok számát, majd a felhasználó írja be az egész számokat, és egyszerűen megjelenítjük őket a képernyőn.

Következtetés:

Nincs semmi baj a fenti programmal, amíg ezt nagyon sokáig folytatjuk, a memóriát kölcsönözzük a halomból, de soha nem tesszük vissza a memóriát a halomba, ez csak abban az esetben történik, amikor a program/alkalmazás rendelkezik hosszú ideig, például 24 órán keresztül futni. Ismét a malloc függvényt fogják hívni, és ez azt jelenti, hogy minden alkalommal, amikor memóriát kölcsönöznek a halomból, és soha nem térnek vissza, ez rossz programozás, ezért szabadon kell írnunk (a memória címét, amelyet fel kell szabadítani), mielőtt visszatérnénk. Tehát minden alkalommal, amikor a malloc mentességet használja, fontos. Tehát a malloc használatával megőriztük a memóriát, és a malloc valóban akkora memóriát foglal le, amennyit kér.

Boldog dinamikus memóriakiosztást!