MALLOC -TOIMINNON KÄYTTÄMINEN C.

How Use Malloc Function C



Malloc on otsikkotiedostossa ilmoitettu sisäänrakennettu toiminto. Malloc on lyhyt nimi 'muistinvaraukselle', ja sitä käytetään dynaamisesti varaamaan yksi suuri viereisen muistin lohko määritetyn koon mukaan. Muistinvarauksia on kahdenlaisia ​​staattisia ja dynaamisia. Staattinen muistinvaraus tehdään kokoamishetkellä, eikä se muutu ajon aikana. Dynaaminen muistin varaus on varaamassa muistia ajon aikana tätä varten; käytämme mallocia. Nyt on kysymys siitä, mistä tämä muisti tulee, joten kaikki C: n dynaamiset vaatimukset täytetään kasamuistista. Periaatteessa sovelluksessamme/ohjelmassamme on 3 erilaista muistia

  • Pino muisti on paikallinen jokaiselle menetelmälle, ja kun menetelmä palaa, pino tyhjentää sen automaattisesti.
  • Globaali muistialue varaa muistin kaikille globaaleille muuttujille. Tämä muistialue luodaan ohjelman alussa, ja lopuksi se tyhjentää muistialueen automaattisesti.
  • Kasamuisti on aina vihollinen, joka täyttää kaikki ohjelman/sovelluksen dynaamiset vaatimukset. Aina kun aiomme käyttää malloc -toimintoa, se lainaa muistia kasasta ja antaa meille osoittimen sille.

Syntaksi:







Mallocin syntaksi on (void*) malloc (size_t size). Syntaksi sanoo siis, että malloc vaatii koon, se palauttaa osoittimen pohjimmiltaan tyhjäksi ja koko t määritellään allekirjoittamattomana kokonaislukuna. Malloc -toiminto yksinkertaisesti varaa muistilohkon kasassa määritetyn koon mukaan, kuten voit nähdä syntaksissa, että koko on määritettävä, ja onnistumisen jälkeen se palauttaa osoittimen, joka osoittaa varatun muistin ensimmäiseen tavuun, muuten palauttaa NULL . Mallocin tehtävä on siis varata muistia ajon ajalta.



Miksi tyhjä osoitin:

Mallocilla ei ole aavistustakaan siitä, mihin se viittaa; se tarkoittaa yksinkertaisesti sitä, että se ei tiedä, mitä tietoja kyseiseen muistipaikkaan tallennetaan. Se vain varaa käyttäjän pyytämän muistin tietämättä muistiin tallennettavien tietojen tyyppiä. Siksi se palauttaa tyhjän osoittimen.



Malloc varaa vain muistin, jonka jälkeen käyttäjän vastuulla on kirjoittaa lähetys sopivaan tyyppiin, jotta sitä voidaan käyttää oikein ohjelmassa. Tyhjä osoitin on osoitin, joka voi osoittaa minkä tahansa tyyppistä dataa, malloc palauttaa tyhjän osoittimen, koska se ei tiedä, minkä tyyppisiä tietoja tallennetaan muistiin.





Tässä pyydämme mallocia varaamaan 6 tavua muistia nyt, jos onnistunut malloc palauttaa tyhjän osoittimen. Siinä tapauksessa meidän on kirjoitettava se kokonaislukutyyppiseksi osoittimeksi, koska haluamme tallentaa kokonaisluvun tähän muistiin. Tässä malloc varaa 6 tavua muistia kasaan, ja ensimmäisen tavun osoite tallennetaan osoittimeen ptr.



Esimerkkiohjelma:

Tässä on yksinkertainen esimerkkiohjelma mallocin käsitteen ymmärtämiseksi oikein.

Tässä näet printf -toiminnon avulla, jota pyydän käyttäjää syöttämään kokonaislukujen määrän. Olemme ilmoittaneet kaksi muuttujaa yläpuolella i ja n. Muuttuja n on paikka, johon tallennamme käyttäjän antaman numeron. Sen jälkeen meillä on malloc -toiminto; haluamme, että malloc jakaa koon, joka vastaa n kokonaislukua. Kerrotaan koko, jos int on n; tämä antaa meille n kokonaisluvun koon. Tämän jälkeen malloc palauttaa tyhjän osoittimen, ja me kirjoitamme sen kokonaislukuosoitimeksi ja tallennamme osoitteen ptr -osoittimeen. Kirjoitus on tärkeää, koska se on hyvä käytäntö.

Jos osoitin sisältää nyt NULL, se tarkoittaa, että muisti ei ole käytettävissä. Joten poistumme vain ohjelmasta poistumisvirheen tilassa. Jos näin ei ole, voimme helposti suorittaa silmukan.

Silmukka kulkee välillä 0-n-1, ja pyydämme käyttäjää syöttämään kokonaisluvun yksitellen joka kerta. Scanf -toiminnossa on yksi asia kirjoitettu ptr+i, koska tiedämme, että ptr sisältää muistin ensimmäisen tavun osoitteen. Oletetaan, että osoite on 1000 tässä i on yhtä suuri kuin nolla, joten 1000+0 on 1000, joten tämän osoitteen sisällä ensimmäinen kokonaisluku tallennetaan ja sen jälkeen kun minusta tulee 1 niin 1000+1, joka on sisäisesti tulkittu (1000) +1 *4 jos oletan, että kokonaisluku on 4 tavua ja se olisi 1004, joten seuraava kokonaisluku tallennetaan 1004 sijaintiin. Ja tämä jatkuu tällä tavalla osoitteet ovat kuten 1000, 1004, 1008 ja niin edelleen. Emme käytä ampersandia ennen ptr+i: tä, koska ptr antaa meille jo osoitteen, kun kirjoitamme ptr, joka on yksinkertaisesti osoitin, ja se sisältää osoitteen, ei arvon, joten et tarvitse merkkiä ampersand sen eteen, ja tämän käsitteen pitäisi olla selkeä.

Tässä silmukassa teemme yksinkertaisesti yhtä asiaa: tulostamme kaikki näytön kokonaisluvut; tietysti käytämme ptr+i: tä, mutta tässä tapauksessa poistamme sen, koska ptr+i edustaa osoitetta, joten meidän on poistettava se. Jos i on 0, se on 1000, koska oletamme, että ensimmäinen osoite on 1000, joten poistamme sen; saamme ensimmäisen kokonaisluvun, jolloin i on 1, ja siitä tulee 1001, mutta tulkitaan 1004: ksi, jos kokonaisluku on 4. Jälleen. Poistamme sen, joten se antaa meille 2toinenkokonaisluku. Tällä tavalla kaikki toimii.

Joten tämä on pohjimmiltaan yksinkertainen ohjelma, joka pyytää käyttäjiä syöttämään n kokonaisluvun, ja sitten näytämme vain nämä kokonaisluvut näytöllä. Ohjelman suorittamisen jälkeen tämä tulee näkyviin.

Ensinnäkin pyydämme käyttäjää syöttämään kokonaislukujen määrän, ja sitten käyttäjä syöttää kokonaislukuja, ja näytämme ne yksinkertaisesti näytöllä.

Johtopäätös:

Yllä olevassa ohjelmassa ei ole mitään vikaa niin kauan kuin jatkamme sitä hyvin pitkään täällä, lainaamme muistia kasasta, mutta emme koskaan palauta muistia takaisin kasaan, se tapahtuu vain siinä tapauksessa, että ohjelma/sovellus on ajaa pitkään, kuten 24 tuntia. He kutsuvat uudelleen malloc -toimintoa, ja tämä tarkoittaa jälleen sitä, että aina kun he lainaavat muistia kasasta eivätkä koskaan palaa, tämä on huono ohjelmointi, joten meidän pitäisi kirjoittaa vapaasti (muistin osoite, joka pitäisi vapauttaa) ennen paluuta. Joten aina, kun käytät malloc free -ohjelmaa, on tärkeää. Joten mallocia käyttämällä meillä on säilynyt muisti, ja malloc varaa muistin niin suuren kuin pyydät.

Hyvää dynaamista muistinvarausta!