C programozás

A MALLOC FUNKCIÓ HASZNÁLATA C

A MALLOC FUNKCIÓ HASZNÁLATA C
A Malloc a fejlécfájlban deklarált beépített függvény . A Malloc a „memória-allokáció” rövid neve, és arra szolgál, hogy dinamikusan lefoglaljon egyetlen összefüggő memóriablokkot a megadott méretnek megfelelően. A memória-allokációnak két típusa van: statikus és dinamikus. A statikus memória lefoglalása a fordítás idején történik, és futás közben nem változik. A dinamikus memóriaallokáció futás közben lefoglalja erre a memóriát; mallocot használunk. Most az a pont, ahol ebből a memóriából származik, tehát a C összes dinamikus követelménye teljesül a kupac memóriából. Alapvetően az alkalmazásunk / programunk 3 féle memóriával rendelkezik

  • A verem memória minden módszerhez lokális, és amikor a metódus visszatér, a verem automatikusan törli azt.
  • A globális memóriaterület az összes globális változóhoz memóriát rendel. Ez a memóriaterület a program elején jön létre, és végül automatikusan kitisztítja a memóriaterületet.
  • A halom memória mindig ellensége teljesíti a program / alkalmazás minden dinamikus követelményét. Valahányszor a malloc funkciót fogjuk használni, kölcsön kap egy kis memóriát a kupacbó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, a mutatót alapvetően egy érvénytelen mutatóval adja vissza, és a t aláíratlan egész számként. A Malloc függvény egyszerűen kioszt egy memóriablokkot a halomban megadott méretnek megfelelően, amint azt a szintaxisban láthatja, hogy a méretet meg kell adni, és a siker után a lefoglalt memória első bájtjára mutató mutatóval tér vissza, NULL. Tehát a malloc feladata a memória lefoglalása a futási időben.

Miért érvénytelen a mutató:

Mallocnak fogalma sincs arról, mire mutat; egyszerűen azt jelenti, hogy nem tudja, milyen adatokat tárolnak a memória helyén. Csak kiosztja a felhasználó által kért memóriát anélkül, hogy tudná a memóriában tárolandó adatok típusát. Ezért küld vissza egy érvénytelen mutatót.

A Malloc csak kiosztja a memóriát, utána a felhasználó felelőssége, hogy megfelelő típusú típust készítsen, hogy az megfelelően használható legyen a programban. Az érvénytelen mutató egy olyan mutató, amely bármilyen típusú adatot képes mutatni, a malloc érvénytelen mutatót ad vissza, mert nem tudja, hogy milyen típusú adatokat tárolnak a memóriában.

Itt arra kérjük a mallocot, hogy most foglaljon le 6 bájt memóriát, ha egy sikeres malloc érvénytelen mutatót ad vissza. Ebben az esetben be kell illesztenünk egy egész típusú mutatóba, mert egy egész számot szeretnénk tárolni abban a memóriában. Itt malloc 6 bájt memóriát oszt ki egy kupacban, és az első bájt címe a ptr mutatóban van tárolva.

Példa program:

Itt van egy egyszerű példa program a malloc fogalmának megfelelő megértése érdekében.

Itt láthatja a printf függvénnyel, arra kérem a felhasználót, hogy adja meg az egész számot. Két változót deklaráltunk i és n felett. Az n változó az a hely, ahol tároljuk a felhasználó által beírt számot. Ezt követően malloc funkciónk van; azt akarjuk, hogy a malloc az egész szám méretének megfelelő méretarányt rendelje hozzá. Szorozzuk a méretet, ha int és n; ez megadja n egész szám méretét. Ezt követően a malloc visszaküldi az érvénytelen mutatót, amelyet egész számra írunk, és a címet a ptr mutatóban tároljuk. A típusírás fontos, mivel ez jó gyakorlat.

Ha a mutató NULL-t tartalmaz, az azt jelenti, hogy a memória nem áll rendelkezésre. Tehát egyszerűen kilépünk a programból a kilépési hiba állapotával. Ha nem ez a helyzet, akkor könnyen futtathatjuk a ciklust.

A hurok 0-tól n-1-ig fog futni, és arra kérjük a felhasználót, hogy minden alkalommal adja meg 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 itt a cím 1000, kezdetben nulla egyenlő, tehát 1000 + 0 1000, tehát ezen a címen belül az első egész számunk tárolásra kerül, majd ezt követően, amikor i 1, így 1000 + 1 lesz, ami belső értelemben (1000) +1 * 4, ha feltételezem, hogy az egész szám 4 bájt, és 1004 lenne, tehát a következő egész szám 1004 helyen lesz tárolva. És ez így folytatódik, a címek 1000, 1004, 1008 stb. Az ampersandot nem használjuk a ptr + i előtt, mert a ptr már megadja a címet, amikor a ptr-t írjuk, ami egyszerűen egy mutató, és a címet tartalmazza, nem pedig az értéket, így nincs szükség az ampersand elé helyezésére, és ennek a koncepciónak egyértelműnek kell lennie.

Ebben a körben egyszerűen egy dolgot csinálunk, és az egész számot kinyomtatjuk a képernyőn; nyilvánvalóan a ptr + i-t használjuk, de itt ebben az esetben elhatároljuk, mert a ptr + i egy címet képvisel, ezért azt el kell tüntetnünk. Ha i megegyezik 0-val, akkor 1000 lesz, mert feltételezzük, hogy az első cím 1000 lesz, tehát elhatároljuk; megkapjuk az első egész számot, akkor i egyenlő 1-vel, és 1001 lesz, de 1004-ként értelmezzük, ha az egész szám 4. Újra. Dereferenciálunk, így megkapja a 2-tnd egé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 adjanak meg n 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 írja be az egész számok számát, majd a felhasználó beírja az egész számokat, és egyszerűen megjelenítjük őket a képernyőn.

Következtetés:

A fenti programban nincs semmi baj, amíg nagyon sokáig folytatjuk, itt kölcsönzünk memóriát a kupacból, de soha nem adjuk vissza a memóriát a kupacba. Ez csak abban az esetben történik, amikor a program / alkalmazás hogy hosszú ideig, például 24 órán keresztül futhasson. Újra hívják a malloc funkciót, és ez ismét azt jelenti, hogy minden alkalommal, amikor memóriát kölcsönöznek a kupacból, és soha nem térnek vissza, ez rossz programozás, ezért visszaírás előtt szabadon kell írnunk (a felszabadítandó memória címét). Tehát amikor a malloc mentes használata fontos. Tehát a malloc használatával konzerváltunk a memóriával, és a malloc valóban akkora memóriát oszt ki, amennyit csak kér.

Boldog dinamikus memória-allokáció!

A Doom telepítése és lejátszása Linuxon
Bevezetés a Doom-ba A Doom sorozat a 90-es években keletkezett az eredeti Doom megjelenése után. Azonnali sláger volt, és ettől kezdve a játéksorozat ...
Vulkan Linux felhasználók számára
A grafikus kártyák minden új generációjával azt látjuk, hogy a játékfejlesztők átlépik a grafikus hűség határait, és egy lépéssel közelebb kerülnek a ...
OpenTTD vs Simutrans
Saját közlekedési szimuláció létrehozása szórakoztató, pihentető és rendkívül csábító lehet. Ezért meg kell győződnie arról, hogy a lehető legtöbb ját...