- 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
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ó!