КАКО КОРИСТИТИ МАЛЛОЦ ФУНКЦИЈУ У Ц.

How Use Malloc Function C



Маллоц је уграђена функција декларисана у датотеци заглавља. Маллоц је скраћени назив за „алокацију меморије“ и користи се за динамичку алокацију једног великог блока суседне меморије према наведеној величини. Постоје две врсте алокације меморије: статичка и динамичка. Статичка меморија се додељује током компилације и не мења се током извођења. Динамичка алокација меморије за ово додељује меморију током извођења; користимо маллоц. Сада је поента одакле долази ова меморија, па су сви динамички захтеви у Ц испуњени из меморије хрпе. У основи, наша апликација/програм ће имати 3 врсте меморије

  • Меморија стека је локална за сваки метод, а када се метода врати, стек је аутоматски брише.
  • Глобално меморијско подручје додељује меморију за све глобалне променљиве. Ово подручје меморије ствара се на почетку програма, а на крају аутоматски брише подручје меморије.
  • Хеап меморија је увек непријатељ који испуњава све динамичке захтеве програма/апликације. Кад год ћемо користити функцију маллоц, она ће позајмити нешто меморије из хрпе и дати нам показивач на њу.

Синтакса:







Синтакса маллоц је (воид*) маллоц (сизе_т сизе). Дакле, синтакса каже да маллоц захтева величину, вратиће показивач у основи као воид показивач, а величина т је дефинисана као цео број без знака. Маллоц функција једноставно додељује меморијски блок према величини наведеној у гомили, као што видите у синтакси да величину треба навести и, у случају успеха, враћа показивач који показује на први бајт додељене меморије, иначе враћа НУЛЛ . Дакле, посао маллоц -а је да алоцира меморију за вријеме извођења.



Зашто показивач воид:

Маллоц нема појма на шта указује; то једноставно значи да не зна који ће се подаци складиштити на тој меморијској локацији. Он само додељује меморију коју корисник захтева, а да не зна тип података који ће се складиштити у меморији. Зато враћа показивач празнине.



Маллоц само додељује меморију након чега је одговорност корисника да куца у одговарајући тип како би се могла правилно користити у програму. Воид показивач је показивач који може усмерити било коју врсту података маллоц враћа воид показивач јер не зна која врста података ће бити ускладиштена у тој меморији.





Овде тражимо од маллоца да сада додели 6 бајтова меморије ако успе, маллоц ће вратити показивач воид. У том случају морамо да га унесемо у показивач типа цео број јер желимо да ускладиштимо цео број у тој меморији. Овде маллоц додељује 6 бајтова меморије у хрпи, а адреса првог бајта се чува у показивачу птр.



Пример програма:

Ево једноставног примера програма да бисте разумели концепт маллоц -а на прави начин.

Овде можете видети са функцијом принтф. Тражим од корисника да унесе број целих бројева. Декларисали смо две променљиве изнад и и н. Променљива н је место где ћемо складиштити број који је унео корисник. Након тога имамо маллоц функцију; желимо да маллоц додели величину еквивалентну величини н целих бројева. Множимо величину ако је инт са н; ово ће нам дати величину н целих бројева. Након тога, маллоц ће вратити воид показивач, а ми га куцамо на целобројни показивач, а адресу чувамо у птр показивачу. Куцање куцања је важно јер је то добра пракса.

Сада, ако показивач садржи НУЛЛ, то значи да меморија није доступна. Зато ћемо једноставно изаћи из програма са статусом грешке при изласку. Ако то није случај, лако можемо покренути фор петљу.

Петља ће се одвијати од 0 до н-1, а ми ћемо тражити од корисника да сваки пут унесе један по један цео број. Унутар функције сцанф постоји једна ствар написана птр+и јер знамо да птр садржи адресу првог бајта меморије. Рецимо да је адреса 1000 овде и је у почетку једнака нули па је 1000+0 1000 па ће унутар те адресе наш први цео број бити ускладиштен, а затим након тога када и постане 1 па 1000+1 које се интерно тумачи као (1000) +1 *4 ако претпостављам да је цео број 4 бајта и да би био једнак 1004, тако да ће следећи цео број бити ускладиштен на локацији 1004. И ово ће се наставити на овај начин, адресе су 1000, 1004, 1008 и тако даље. Не користимо амперсанд пре птр+и зато што нам птр већ даје адресу када уписујемо птр, што је једноставно показивач и садржи адресу, а не вредност, тако да нема захтева да се испред њега ставља амперсанд, и овај концепт би требао бити јасан.

Овде, у овој петљи, једноставно радимо једну ствар и штампамо све целе бројеве на екрану; Очигледно, користимо птр+и, али овде, у овом случају, уклањамо референцу из разлога што птр+и представља адресу, па је морамо дереференцирати. Ако сам једнак 0, то ће бити 1000 јер претпостављамо да ће прва адреса бити 1000, па га дереференцирамо; добићемо први цео број тада и једнак 1, и он ће постати 1001 али ће се тумачити као 1004 ако је величина целог броја 4. Поново. Дереференцирамо га, па ће нам то дати 2ндцео број. На овај начин све функционише.

Дакле, ово је у основи једноставан програм који тражи од корисника да унесу н цео број, а затим једноставно приказујемо те целе бројеве на екрану. Након покретања програма, ово ће се приказати.

Прво тражимо од корисника да унесе број целих бројева, а затим корисник уноси целе бројеве, а ми их једноставно приказујемо на екрану.

Закључак:

Нема ништа лоше у горе наведеном програму све док га настављамо јако дуго овде позајмљујемо меморију са гомиле, али никада не враћамо меморију назад на хрпу, то се дешава само у том случају када програм/апликација имају да ради дуго као 24 сата. Поново ће позвати маллоц функцију, а то опет значи да сваки пут када позајмљују меморију са гомиле и никада се не врате, ово је лоше програмирање, па бисмо требали да напишемо бесплатно (адресу меморије коју треба ослободити) пре повратка. Дакле, кад год је употреба бесплатног маллоц -а важна. Дакле, користећи маллоц, сачували смо меморију, а маллоц додељује меморију толико велику колико то тражите.

Срећно динамичко распоређивање меморије!