KUIDAS MALLOC FUNKTSIOONI KASUTADA C

How Use Malloc Function C



Malloc on päisefailis deklareeritud sisseehitatud funktsioon. Malloc on mälu eraldamise lühinimi ja seda kasutatakse ühe suure külgneva mälu ploki dünaamiliseks eraldamiseks vastavalt määratud suurusele. Mälu eraldamist on kahte tüüpi - staatiline ja dünaamiline. Staatiline mälu eraldatakse kompileerimise ajal ja see ei muutu käitusajal. Dünaamiline mälu eraldamine on selleks mälu eraldamine käitusajal; kasutame malloci. Nüüd on asi selles, kust see mälu tuleb, nii et kõik dünaamilised nõuded C -s on täidetud kuhjamälust. Põhimõtteliselt on meie rakendusel/programmil 3 tüüpi mälu

  • Pinu mälu on iga meetodi jaoks kohalik ja kui meetod naaseb, tühjendab see selle automaatselt.
  • Globaalne mälupiirkond eraldab mälu kõigi globaalsete muutujate jaoks. See mälupiirkond luuakse programmi alguses ja lõpuks puhastab see mälupiirkonna automaatselt.
  • Hunnikmälu on alati vaenlane, kes täidab kõik programmi/rakenduse dünaamilised nõuded. Alati, kui hakkame kasutama malloc -funktsiooni, laenab see hunnikust mälu ja annab meile sellele kursori.

Süntaks:







Malloci süntaks on (void*) malloc (size_t size). Nii et süntaks ütleb, et malloc nõuab suurust, tagastab kursori põhimõtteliselt tühja kursori ja suurus t on defineeritud allkirjata täisarvuna. Funktsioon Malloc eraldab lihtsalt mäluploki vastavalt kuhjas määratud suurusele, nagu näete süntaksis, et suurus tuleb täpsustada, ja edukuse korral tagastab see osuti, mis osutab eraldatud mälu esimesele baidile, muidu tagastab NULL . Niisiis, malloci ülesanne on eraldada tööajale mälu.



Miks tühi osuti:

Mallocil pole aimugi, millele ta osutab; see tähendab lihtsalt seda, et ta ei tea, milliseid andmeid sellesse mälukohta salvestatakse. See eraldab ainult kasutaja soovitud mälu, teadmata mällu salvestatavate andmete tüüpi. Sellepärast tagastab see tühja osuti.



Malloc eraldab mälu alles pärast seda, kui kasutaja vastutab tüübi edastamise eest sobivale tüübile, et seda saaks programmis õigesti kasutada. Tühi -kursor on osuti, mis võib osutada mis tahes tüüpi andmetele, kui malloc tagastab tühimike kursori, kuna see ei tea, millist tüüpi andmed sellesse mällu salvestatakse.





Siin palume mallocil eraldada nüüd 6 baiti mälu, kui edukas malloc tagastab tühja kursori. Sellisel juhul peame selle sisestama täisarvulisele kursorile, kuna soovime sellesse mällu salvestada täisarvu. Siin eraldab malloc kuhjaga 6 baiti mälu ja esimese baidi aadress salvestatakse osuti ptr.



Näidisprogramm:

Siin on lihtne näidisprogramm malloci mõiste õigeks mõistmiseks.

Siin näete funktsiooni printf abil, ma palun kasutajal sisestada täisarvude arv. Oleme deklareerinud kaks muutujat i ja n kohal. Muutuja n on koht, kuhu salvestame kasutaja sisestatud numbri. Pärast seda on meil malloc -funktsioon; tahame, et malloc eraldaks suuruse, mis on ekvivalentne n täisarvu suurusega. Korrutame suuruse, kui int on n; see annab meile n täisarvu suuruse. Pärast seda tagastab malloc tühja kursori ja me sisestame selle täisarvuliseks osutajaks ning salvestame aadressi ptr -osuti sisse. Kirjutamine on oluline, kuna see on hea tava.

Kui kursor sisaldab NULL -i, tähendab see, et mälu pole saadaval. Seega väljume lihtsalt programmist väljumise tõrke olekuga. Kui see nii pole, saame hõlpsalt käivitada tsükli.

Tsükkel kestab vahemikus 0 kuni n-1 ja me palume kasutajal sisestada iga kord ükshaaval täisarvu. Funktsiooni scanf sees on üks asi ptr+i, nagu me teame, et ptr sisaldab mälu esimese baidi aadressi. Oletame, et siin on aadress 1000 *4 kui ma eeldan, et täisarvu suurus on 4 baiti ja see oleks võrdne 1004 -ga, seega salvestatakse järgmine täisarv 1004 asukohta. Ja see jätkub sel viisil, aadressid on näiteks 1000, 1004, 1008 ja nii edasi. Me ei kasuta ampersandi enne ptr+i, sest ptr annab meile juba aadressi, kui kirjutame ptr, mis on lihtsalt kursor, ja see sisaldab aadressi, mitte väärtust, seega ei ole vaja märkide ette kirjutada ja see mõiste peaks olema selge.

Siin selles silmus teeme lihtsalt ühte asja, prindime ekraanile kõik täisarvud; ilmselgelt kasutame ptr+i, kuid siinkohal tühistame selle, kuna ptr+i tähistab aadressi, seega peame selle muutma. Kui i võrdub 0 -ga, on see 1000, sest eeldame, et esimene aadress on 1000, seega tühistame selle; saame esimese täisarvu, siis i võrdub 1 -ga, ja sellest saab 1001, kuid seda tõlgendatakse kui 1004, kui täisarvu suurus on 4. Jällegi. Me tühistame selle, nii et see annab meile 2ndtäisarv. Nii toimib kõik.

Niisiis, see on põhimõtteliselt lihtne programm, mis palub kasutajatel sisestada n täisarvu ja siis kuvame need täisarvud lihtsalt ekraanil. Pärast programmi käivitamist kuvatakse see.

Esiteks palume kasutajal sisestada täisarvude arv ja seejärel sisestatakse täisarvud ning me lihtsalt kuvame need ekraanil.

Järeldus:

Ülaltoodud programmis pole midagi valesti, kui jätkame seda siin väga pikka aega, me laename mälestust hunnikust, kuid me ei tagasta mälu kunagi hunnikusse, see juhtub ainult sel juhul, kui programm/rakendus on joosta pikka aega, näiteks 24 tundi. Nad kutsuvad uuesti malloc -funktsiooni ja see tähendab jälle, et iga kord, kui nad hunnikust mälu laenavad ja kunagi tagasi ei tule, on see halb programmeerimine, seega peaksime enne tagasipöördumist kirjutama vaba (mälu aadress, mis tuleks vabastada). Nii et alati, kui kasutate malloc free, on oluline. Niisiis, kasutades malloci, oleme säilitanud mälu ja malloc eraldab mälu nii suureks, kui te seda küsite.

Head dünaamiliselt mälu eraldamist!