On-line učionica

30. januar 2015.

Dinamička alokacija memorije

Filed under: C posle Pascal-a,Programiranje — jelena100janovic @ 12:32 pm

Počećemo od primera povezane liste…

Kod61

Šta radi ovaj deo koda? Formira dva čvora liste i povezuje ih…

Slika7

Dakle, šta smo uradili? Deklarisali smo strukturu koja se sastoji od podatka i pokazivača na sledeći član liste. Unutar strukture smo morali da deklarišemo pokazivač na samu strukturu, koja još nije deklarisana, ali ne brinite! To je dozvoljeno zato što smo deklarisali pokazivač, a on uvek sadrži samo adresu promenljive na koju pokazuje, pa to smemo da radimo. Ne bi smeli da deklarišemo samu strukturu, jer za nju još ne znamo koliko memorije zauzima.

Dalje, ovaj deo koda deklariše dva čvora i povezuje ih. Naravno, nama je potrebno više članova, pa da ne bismo deklarisali mnogo promenljivih, dozvoljeno je da to radimo u programu, pomoću dinamičke alokacije memorije.

Ovde se možda pitate šta je falilo nizovima? Pa, setite se, za njih smo uvek određivali maksimalni broj članova. I sad, zamislite da je moguće da koristimo 1000 članova, a mi iskoristimo samo 2. Ostalih 998 memorijskih lokacija je uzalud potrošeno!

Dinamičku alokaciju memorije najčešće vršimo pomoću funkcije:

void *malloc(size_t brbajtova)

Ona vraća pokazivač na početak memorijskog bloka veličine brbajtova. Ukoliko je nemoguće alocirati memoriju, vraća NULL.

Dakle,

Kod62

pokušava da rezerviše 100 bajtova i njihovu početnu adresu dodeljuje promenljivoj cp.

Češće se koristi uz funkciju sizeof da bismo tačno odredili koliko memorije je potrebno:

Kod63

Bolje je koristiti sizeof, jer tako dobijamo kod koji ne zavisi od konfiguracije računara na kome se izvršava. Može se koristiti za sve tipove podataka, promenljive i strukture. Samo to, čiju memorijsku veličinu želimo, prosledimo kao argument.

U gornjem primeru možemo koristiti alociranu memoriju kao niz:

Kod64

Kada završimo sa određenim delom memorije, treba da je oslobodimo. Oslobođena memorija se može ponovo koristiti. To postižemo funkcijom free kojoj treba samo da prosledimo pokazivač na memoriju koju želimo da oslobodimo.

Postoje još dve funkcije za alokaciju memorije:

void *calloc(size_t brelemenata, size_t brbajtova)

void *realloc(void *p, size_t novbrbajtova)

Funkcija malloc ne inicijalizuje memoriju. Ako želimo da postavimo vrednost alocirane memorije na nulu, koristimo calloc. Ona je manje isplatljiva u smislu vremena izvršavanja, ali povremeno je zgodnija od malloc. Takođe primetite kako se sintaksa razlikuje, jer calloc uzima broj željenih elemenata i veličinu svakog od članova kao posebne argumente.

Da bi deklarisali i inicijalizovali 100 celih brojeva, napisali bismo:

Kod65

Realloc je funkcija koja pokušava da promeni veličinu već alocirane memorije. Nova veličina može biti veća ili manja. Ako se blok memorije povećava, onda se stari sadržaj ne menja i nova memorija se dodaje na kraj bloka. Ako se smanjuje, onda se ostatak sadržaja ne menja.

Ako se veličina bloka ne može promeniti, realloc će pokušati da nađe novi blok memorije i prekopirati sadržaj starog. Zapamtite da se u tom slučaju adresa pokazivača menja. Ako je nemoguće promeniti veličinu memorije, onda realloc vraća NULL.

Dakle, da bi promenili memoriju iz gornjeg primera u blok od 50 brojeva umesto 100, jednostavno pišemo:

Kod66

Hajde da se sada vratimo na naš primer sa listom:

Kod67

Sada možemo da pokušamo da ovećamo listu dinamički:

Kod68

Ovo će alocirati memoriju za prvi član.

Ako želimo da oslobodimo memoriju, koristićemo free funkciju:

Kod69

Ostavite komentar »

Nema komentara.

RSS feed for comments on this post. TrackBack URI

Ostavite odgovor

Popunite detalje ispod ili pritisnite na ikonicu da biste se prijavili:

WordPress.com logo

Komentarišet koristeći svoj WordPress.com nalog. Odjavite se / Promeni )

Slika na Tviteru

Komentarišet koristeći svoj Twitter nalog. Odjavite se / Promeni )

Fejsbukova fotografija

Komentarišet koristeći svoj Facebook nalog. Odjavite se / Promeni )

Google+ photo

Komentarišet koristeći svoj Google+ nalog. Odjavite se / Promeni )

Povezivanje sa %s

Create a free website or blog at WordPress.com.

%d bloggers like this: