KAKO UPORABLJATI FUNKCIJO MALLOC V C

How Use Malloc Function C



Malloc je vgrajena funkcija, razglašena v datoteki z glavo. Malloc je kratko ime za „dodelitev pomnilnika“ in se uporablja za dinamično dodelitev enega velikega bloka sosednjega pomnilnika glede na podano velikost. Obstajata dve vrsti statične in dinamične dodelitve pomnilnika. Statična dodelitev pomnilnika se izvede v času sestavljanja in se med izvajanjem ne spreminja. Dinamična dodelitev pomnilnika za to dodeljuje pomnilnik med izvajanjem; uporabljamo malloc. Sedaj je bistvo, od kod prihaja ta pomnilnik, zato so vse dinamične zahteve v C izpolnjene iz spomina kup. V bistvu bo naša aplikacija/program imela 3 vrste pomnilnika

  • Pomnilnik sklada je lokalni za vsako metodo, in ko se metoda vrne, jo sklad samodejno počisti.
  • Območje globalnega pomnilnika dodeljuje pomnilnik za vse globalne spremenljivke. To pomnilniško območje se ustvari na začetku programa in na koncu samodejno počisti pomnilniško območje.
  • Pomnilnik kup je vedno sovražnik, ki izpolnjuje vse dinamične zahteve programa/aplikacije. Kadar koli bomo uporabili funkcijo malloc, si bo iz kopije izposodila nekaj pomnilnika in nam dala kazalec nanjo.

Sintaksa:







Sintaksa malloc je (void*) malloc (size_t size). Tako skladnja pravi, da malloc zahteva velikost, kazalec bo v bistvu vrnil kazalec void, velikost t pa je definirana kot nepodpisano celo število. Funkcija Malloc preprosto dodeli pomnilniški blok glede na velikost, določeno v kupu, kot lahko vidite v sintaksi, da je treba velikost določiti, in ob uspehu vrne kazalec, ki kaže na prvi bajt dodeljenega pomnilnika, sicer vrne NULL . Naloga malloca je torej dodeliti pomnilnik v času izvajanja.



Zakaj kazalec void:

Malloc nima pojma, na kaj kaže; preprosto pomeni, da ne ve, kateri podatki bodo shranjeni na tem pomnilniškem mestu. Samo dodeljuje pomnilnik, ki ga zahteva uporabnik, ne da bi vedel, kakšne podatke je treba shraniti v pomnilniku. Zato vrne kazalec praznine.



Malloc samo dodeli pomnilnik, nato pa je uporabnikova odgovornost, da vtipka ustrezno vrsto, da jo bo mogoče pravilno uporabiti v programu. Kazalec void je kazalec, ki lahko pokaže katero koli vrsto podatkov, malloc vrne void kazalec, ker ne ve, katera vrsta podatkov bo shranjena v tem pomnilniku.





Tukaj prosimo malloc, naj zdaj dodeli 6 bajtov pomnilnika, če bo malloc uspel vrniti kazalec void. V tem primeru ga moramo vnesti v kazalec tipa celega števila, ker želimo v to pomnilnik shraniti celo število. Tu malloc dodeli 6 bajtov pomnilnika v kupu, naslov prvega bajta pa je shranjen v kazalcu ptr.



Primer programa:

Tukaj je preprost primer programa, s katerim lahko na pravi način razumete pojem malloc.

Tukaj lahko vidite s funkcijo printf prosim uporabnika, da vnese število celih števil. Dve spremenljivki smo razglasili nad i in n. Spremenljivka n je kraj, kamor bomo shranili številko, ki jo je vnesel uporabnik. Po tem imamo funkcijo malloc; želimo, da malloc dodeli velikost, ki je enakovredna velikosti n celih števil. Velikost množimo, če je int z n; to nam bo dalo velikost n celih števil. Po tem bo malloc vrnil kazalec void in ga vtipkamo v celoštevilčni kazalec ter naslov shranimo v kazalec ptr. Tipkanje je pomembno, saj je dobra praksa.

Če kazalec vsebuje NULL, to pomeni, da pomnilnik ni na voljo. Tako bomo preprosto izstopili iz programa s statusom napake pri izhodu. Če temu ni tako, lahko preprosto zaženemo zanko for.

Zanka bo tekla od 0 do n-1 in od uporabnika bomo vsakič zahtevali, da vnese celo število eno za drugim. Znotraj funkcije scanf je napisana ena stvar ptr+i, saj vemo, da ptr vsebuje naslov prvega bajta pomnilnika. Recimo, da je naslov 1000 tukaj i je na začetku enak nič, zato je 1000+0 1000, zato bo znotraj tega naslova shranjeno naše prvo celo število, potem pa potem, ko i postane 1, torej 1000+1, ki je interno interpretirano kot (1000) +1 *4, če predpostavljam, da je velikost celega števila 4 bajte in bi bila enaka 1004, zato bo naslednje celo število shranjeno na mestu 1004. In na ta način se bodo nadaljevali naslovi, kot so 1000, 1004, 1008 itd. Ampersanda ne uporabljamo pred ptr+i, ker nam ptr že daje naslov, ko zapišemo ptr, ki je preprosto kazalec in vsebuje naslov, ne vrednosti, zato pred njim ni zahteve po postavitvi znaka & ta koncept mora biti jasen.

Tukaj v tej zanki preprosto počnemo eno stvar in natisnemo vsa cela števila na zaslonu; očitno uporabljamo ptr+i, toda tukaj ga v tem primeru razmejimo, ker ptr+i predstavlja naslov, zato ga moramo razlikovati. Če je i enako 0, bo to 1000, ker predvidevamo, da bo prvi naslov 1000, zato ga ločimo; dobili bomo prvo celo število, potem je i enako 1, in bo postalo 1001, vendar interpretirano kot 1004, če je velikost celega 4. Ponovno. Razlikujemo ga, zato nam bo dal 2ndcelo število. Na ta način vse deluje.

Torej, to je v bistvu preprost program, ki od uporabnikov zahteva, da vnesejo n celo število, nato pa preprosto prikažemo ta cela števila na zaslonu. Po izvedbi programa se prikaže.

Najprej od uporabnika zahtevamo, da vnese število celih števil, nato pa uporabnik vnese cela števila, mi pa jih preprosto prikažemo na zaslonu.

Zaključek:

V zgornjem programu ni nič narobe, dokler ga nadaljujemo zelo dolgo, tukaj si sposodimo pomnilnik iz kopice, vendar nikoli ne vrnemo pomnilnika nazaj v kup, to se zgodi le v primeru, ko ima program/aplikacija da teče dolgo časa, na primer 24 ur. Ponovno bodo klicali funkcijo malloc, kar spet pomeni, da vsakič, ko si izposodijo pomnilnik iz kope in se nikoli ne vrnejo, je to slabo programiranje, zato moramo pred vrnitvijo napisati brezplačno (naslov pomnilnika, ki ga je treba sprostiti). Torej, kadar je uporaba brez malloca pomembna. Tako smo z malloc ohranili pomnilnik in malloc dodeljuje pomnilnik tako velik, kot ga zahtevate.

Srečno dinamično dodeljevanje pomnilnika!