KAKO KORISTITI MALLOC FUNKCIJU U C

How Use Malloc Function C



Malloc je ugrađena funkcija deklarirana u datoteci zaglavlja. Malloc je kratki naziv za 'dodjelu memorije' i koristi se za dinamičku dodjelu jednog velikog bloka susjedne memorije prema navedenoj veličini. Postoje dvije vrste dodjele memorije: statička i dinamička. Statička se memorija dodjeljuje tijekom kompilacije, a ne mijenja se tijekom izvođenja. Dinamička dodjela memorije dodjeljuje memoriju za vrijeme izvođenja za to; koristimo malloc. Sada je točka odakle dolazi ova memorija, pa su svi dinamički zahtjevi u C ispunjeni iz memorije hrpe. U osnovi, naša aplikacija/program imat će 3 vrste memorije

  • Memorija steka lokalna je za svaku metodu, a kad se metoda vrati, stek je automatski briše.
  • Globalno memorijsko područje dodjeljuje memoriju za sve globalne varijable. Ovo memorijsko područje stvara se na početku programa, a na kraju automatski briše memorijsko područje.
  • Memorija hrpe uvijek je neprijatelj koji ispunjava sve dinamičke zahtjeve programa/aplikacije. Kad god ćemo koristiti funkciju malloc, posudit će malo memorije iz hrpe i dati nam pokazivač na nju.

Sintaksa:







Sintaksa malloc je (void*) malloc (size_t size). Dakle, sintaksa kaže da malloc zahtijeva veličinu, vratit će pokazivač u osnovi kao void pokazivač, a veličina t je definirana kao bezznačni cijeli broj. Malloc funkcija jednostavno dodjeljuje memorijski blok prema veličini navedenoj u hrpi, kao što možete vidjeti u sintaksi da veličinu treba navesti i, u slučaju uspjeha, vraća pokazivač koji pokazuje na prvi bajt dodijeljene memorije, inače vraća NULL . Dakle, posao malloca je dodijeliti memoriju za vrijeme izvođenja.



Zašto pokazivač void:

Malloc nema pojma na što ukazuje; to jednostavno znači da ne zna koji će podaci biti pohranjeni na tom memorijskom mjestu. On samo dodjeljuje memoriju koju je zatražio korisnik ne znajući vrstu podataka koji će se pohraniti unutar memorije. Zato vraća pokazivač praznine.



Malloc samo dodjeljuje memoriju nakon čega je odgovornost korisnika da kuca u odgovarajući tip kako bi se mogla pravilno koristiti u programu. Void pokazivač je pokazivač koji može usmjeriti bilo koju vrstu podataka malloc vraća void pokazivač jer ne zna koja će vrsta podataka biti pohranjena u toj memoriji.





Ovdje tražimo od malloca da dodijeli 6 bajtova memorije ako uspješno malloc vrati pokazivač void. U tom slučaju moramo ga upisati u pokazivač tipa cijeli broj jer želimo spremiti cijeli broj u tu memoriju. Ovdje malloc dodjeljuje 6 bajtova memorije u hrpu, a adresa prvog bajta pohranjena je u pokazivaču ptr.



Primjer programa:

Evo jednostavnog primjera programa za razumijevanje pojma malloc na pravi način.

Ovdje možete vidjeti s funkcijom printf. Tražim od korisnika da unese broj cijelih brojeva. Proglasili smo dvije varijable iznad i i n. Varijabla n je mjesto gdje ćemo pohraniti broj koji je unijeo korisnik. Nakon toga imamo malloc funkciju; želimo da malloc dodijeli veličinu ekvivalentnu veličini n cijelih brojeva. Množimo veličinu ako je int s n; to će nam dati veličinu n cijelih brojeva. Nakon toga, malloc će vratiti pokazivač void, a mi ga unosimo u cjelobrojni pokazivač i spremamo adresu unutar ptr pokazivača. Kucanje vrsta je važno jer je to dobra praksa.

Sada, ako pokazivač sadrži NULL, to znači da memorija nije dostupna. Zato ćemo jednostavno izaći iz programa sa statusom neuspjelog izlaza. Ako to nije slučaj, lako možemo pokrenuti for petlju.

Petlja će se odvijati od 0 do n-1, a mi ćemo tražiti od korisnika da svaki put unese cijeli broj jedan po jedan. Unutar funkcije scanf postoji jedna stvar napisana ptr+i jer znamo da ptr sadrži adresu prvog bajta memorije. Recimo da je adresa 1000 ovdje i je u početku jednaka nuli pa je 1000+0 1000 pa će unutar te adrese biti pohranjen naš prvi cijeli broj pa nakon toga kad i postane 1 pa 1000+1 što se interno interpretira kao (1000) +1 *4 ako pretpostavljam da je veličina cijelog broja 4 bajta, a to bi bilo jednako 1004, tako da će sljedeći cijeli broj biti pohranjen unutar 1004 lokacije. I to će se nastaviti na ovaj način, adrese su poput 1000, 1004, 1008 i tako dalje. Ne koristimo ampersand prije ptr+i jer nam ptr već daje adresu kada upisujemo ptr, što je jednostavno pokazivač, a sadrži adresu, a ne vrijednost, pa nema zahtjeva da se ispred njega stavi ampersand, i ovaj koncept bi trebao biti jasan.

Ovdje u ovoj petlji jednostavno radimo jednu stvar, ispisujemo sve cijele brojeve na ekranu; očito, koristimo ptr+i, ali ovdje, u ovom slučaju, ga dereferenciramo jer ptr+i predstavlja adresu, pa je moramo razlikovati. Ako sam jednak 0, bit će 1000 jer pretpostavljamo da će prva adresa biti 1000, pa ga dereferenciramo; dobit ćemo prvi cijeli broj tada je i jednak 1, i on će postati 1001, ali će se tumačiti kao 1004 ako je veličina cijelog broja 4. Opet. Dereferenciramo ga, pa će nam to dati 2ndcijeli broj. Na ovaj način sve funkcionira.

Dakle, ovo je u osnovi jednostavan program koji traži od korisnika da unesu n cijeli broj, a zatim jednostavno prikazujemo te cijele brojeve na ekranu. Nakon izvršavanja programa, ovo će se prikazati.

Prvo tražimo od korisnika da unese broj cijelih brojeva, a zatim korisnik unosi cijele brojeve, a mi ih jednostavno prikazujemo na ekranu.

Zaključak:

Nema ništa loše u gore navedenom programu sve dok ga nastavljamo jako dugo ovdje posuđujemo memoriju s hrpe, ali nikada ne vraćamo memoriju na hrpu, to se događa samo u tom slučaju kada program/aplikacija imaju da radi dugotrajno, poput 24 sata. Ponovno će pozivati ​​funkciju malloc, a to opet znači da svaki put kad posuđuju memoriju s hrpe i nikad se ne vraćaju, to je loše programiranje, pa bismo trebali pisati besplatno (adresu memorije koja bi trebala biti oslobođena) prije povratka. Dakle, kad god je korištenje besplatnog malloca važno. Dakle, koristeći malloc, očuvali smo memoriju, a malloc dodjeljuje memoriju onoliko veliku koliko to tražite.

Sretno dinamičko dodjeljivanje memorije!