Dinamikus elosztási funkciók

A mutatók arra szolgálnak, hogy dinamikusan hozzárendeljék a számítógép memóriáját az adattároláshoz. A dinamikus elosztás azt jelenti, hogy a program az adatok végrehajtására végrehajtott memóriáját lefoglalja. A globális változók memóriája a fordítási időben és a nem statikus helyi változóknál - a kötegben van elosztva. A program végrehajtása során sem a globális, sem a helyi változók nem rendelhetők további memóriába. De gyakran előfordul ilyen szükségszerűség, és a szükséges memória mennyisége előre ismeretlen. Ez például dinamikus adatstruktúrák, például összekapcsolt listák vagy bináris fák használatakor történik. Az ilyen adatstruktúrák bővülnek vagy csökkenthetők, ha a programot szükség szerint futtatja. Az ilyen struktúrák megvalósításához a programnak olyan eszközökre van szüksége, amelyek szükség szerint kiosztják és kiadják a memóriát.

A dinamikus adatelosztás funkcióiban a C-ben tárolt memória az ún. dinamikusan elosztott memória terület (halom) [1]. Dinamikusan memóriát terület - ez egy szabad memória terület nem a program által használt, az operációs rendszer vagy más programokat. A méret a kupac terület nem ismertek, de a szabály elég memória befogadására az adatokat a program. A legtöbb fordító támogatja könyvtári funkciókat, hogy a jelenlegi mérete dinamikusan lefoglalt memória területek, de ezek a funkciók nem határozza meg a szabvány C. Bár a méret a kupac terület igen nagy, mégis véges és kimerül.

A C dinamikus elosztási rendszer alapja a malloc () és a free () függvény. Ezek a funkciók együtt működnek. A malloc () függvény memóriát oszt ki, és szabad () - szabadítja meg. Ez azt jelenti, hogy minden egyes kérelemnél a malloc () függvény a szükséges szabad memóriaterületet osztja ki, és szabad () felszabadítja azt, vagyis visszatér a rendszerbe. Az ilyen funkciókat használó programnak tartalmaznia kell egy fejlécfájlt .

A malloc () prototípus:

Itt a bájtok száma az adatok tárolásához szükséges memória mérete. (Type Size_t definíciója a mint néhány aláíratlan egész szám.) A malloc () függvény egy típusú void * mutatót eredményez. így bármilyen típusú mutatóhoz rendelheti. Ha sikeres, a malloc () egy mutatót visz vissza a dinamikusan hozzárendelt memóriaterületen elosztott memória folytonos része első bájtjába. Ha nincs elegendő szabad memória a dinamikusan felosztott memóriaterületen a lekérdezés végrehajtásához, akkor a memóriát nem osztják ki, és a malloc () nulla értéket ad vissza.

A következő programfájl végrehajtásakor egy 1000 byte-os összefüggő memóriarész van elosztva:

A hozzárendelés után a p mutató az elosztott memória 1000 bájtjának első részét jelenti.

A következő példa az 50 egészre osztja a memóriát. A mobilitás növelése (a program hordozhatósága egyik gépről a másikra) a felhasználó méretét használja.

Mivel a dinamikusan felosztott memória terület nem végtelen, minden alkalommal, amikor az adatok kerülnek, meg kell vizsgálni, hogy történt-e. Ha a malloc () nem tudta elkülöníteni a szükséges memóriát bármilyen okból, akkor nulla értéket ad vissza. A következő példa bemutatja, hogyan történik az elhelyezés ellenőrzésének sikere:

Természetesen a kilépés () program kilépése helyett minden hibakezelőt elhelyezhet. Kötelező itt csak az a követelmény, hogy ne használjuk a p mutatót. ha nulla.

A function free () a malloc () függvénnyel ellentétben van abban az értelemben, hogy a malloc () függvény használatával korábban kiosztott memória egy részét visszatér a rendszerbe. Más szavakkal felszabadítja azt a memóriát, amelyet a malloc () függvény újra felhasználhat. Az ingyenes () függvény a következő prototípussal rendelkezik:

Itt p egy mutató a memóriaszakaszhoz, amelyet a malloc () függvény előtt osztottak ki. Az ingyenes () függvény nem nevezhető érvénytelen argumentummal, azonnal elpusztítja az egész memóriaelosztási rendszert.

A C dinamikus elosztási alrendszert a mutatókkal együtt használva különböző szoftverkonstrukciók, például összekapcsolt listák és bináris fák létrehozására használhatók. Az ilyen szerkezetek használatának számos példája a IV. Részben található. Itt a dinamikus elosztás másik fontos alkalmazását tekintjük: a tömbök elhelyezése.

Dinamikus memóriaelosztás a tömbök számára

Gyakran szükség van a memória dinamikus kiosztására a malloc () segítségével. de a memóriával való együttműködés sokkal kényelmesebb, mintha egy oszlop indexelhető lenne. Ebben az esetben létre kell hoznia egy dinamikus tömböt. Nem nehéz ezt megtenni, mert minden mutató indexelhető tömbként. A következő példában egy egydimenziós dinamikus tömb tartalmaz egy karakterláncot:

Az első használat előtt először ellenőrizze, hogy a memória mennyisége sikeres-e. Ez az ellenőrzés szükséges a null pointer véletlen használatának megakadályozásához. Vegye figyelembe, hogy az s mutatót a get () függvényben használják. valamint amikor megjelenik (de ez alkalommal egy közönséges tömb).

A memóriát dinamikusan is eloszthatja egy többdimenziós tömbhöz. Ehhez olyan mutatót kell kijelölnie, amely mindent meghatároz, kivéve a tömb legkülső dimenzióját. A következő példában [2] egy kétdimenziós dinamikus tömb tartalmazza az 1-től 10-ig terjedő számok táblázatait 1, 2, 3 és 4-es hatványokban.

A program a következőket jeleníti meg:

A fő programban (p ()) mutatott p mutatót a következőképpen jelöljük:

Mint már korábban említettük, a C ++-ban kifejezetten meg kell változtatnunk a mutatók típusát. Ezért annak érdekében, hogy ez a program helyes legyen mind a C-ben, mind a C ++-ban, a malloc () függvény által visszaadott érték típusát explicit módon kell megadni. Ehhez a p-mutatónak ezt az értéket kell megadnia a következőképpen:

Sok programozó a mutatótípusok kifejezett konverzióját használja a C ++ kompatibilitás biztosítása érdekében.

[1] Más nevek is használatosak: dinamikus terület. dinamikusan elkülönített terület. csokor. rendezetlen tömb (adatok).

Kapcsolódó cikkek