malloc (od engl. memory allocation) je funkcija koja u programskom jeziku C služi za dinamičku alokaciju memorije. Pri pozivu svake funkcije, na steku se alocira neophodna memorija za sve promenljive koje se koriste u toj funkciji. Međutim, da bi se ova memorija alocirala na steku, neophodno je da se unapred (u vreme kompilacije) zna koje se sve promenljive koriste, i koliko memorije (bajtova) one zahtevaju. Problem se javlja ukoliko se u vreme kompilacije ne zna koliko memorije je potrebno. Na primer, ukoliko se u funkciji koristi niz čija dužina zavisi od ulaza koji prosleđuje korisnik programa. U takvim slučajevima se pribegava dinamičkoj alokaciji memorije pomoću funkcije malloc, ili neke od njoj srodnih funkcija. Memorija koju malloc alocira se ne nalazi na steku, već u hipu.

Funkcija malloc se nalazi u standardnoj biblioteci, koja se uključuje naredbom

#include <stdlib.h>

Upotreba

uredi

Funkciji malloc se prosleđuje jedan celobrojni argument, koji označava količinu bajtova koje je potrebno alocirati.

malloc(brojBajtova); /* алоцира brojBajtova бајтова, и враћа показивач на алоцирану меморију */

malloc vraća pokazivač na početak dela memorije odgovarajuće veličine ili NULL ukoliko je došlo do greške i memorija nije alocirana. Pokazivač koji malloc vraća je tipa void, tako da je neophodno kastovati ga u pokazivač odgovarajućeg tipa da bi radila pokazivačka aritmetika.

(tipPodataka*)malloc(brojBajtova); /* алоцира brojBajtova бајтова и враћа показивач типа tipPodataka */

Međutim, ni ovo nije praktično, jer bismo morali da znamo tačan broj bajtova koji je potreban za tip ili strukturu podataka koju koristimo. Jedan tip podatka na različitim arhitekturama računara može da zauzima više ili manje bajtova, tako da se u praksi nikada ne navodi eksplicitno koliko bajtova je neophodno, već se koristi funkcija sizeof, koja kao argument uzima tip podataka, a vraća njegovu veličinu u bajtovima. Ova funkcija se poziva u okviru poziva funkcije malloc, za odgovarajući tip podataka, a zatim se vrednost koju ona vraća množi odgovarajućim brojem. Na primer, ukoliko nam je potreban celobrojan niz dužine n, poziv funkciji bi izgledao ovako:

(int*)malloc(sizeof(int)*n)/* алоцира неопходан број бајтова за смештање n int-ова и враћа показивач типа int */

Oslobađanje memorije

uredi

Ako alocirana memorija u jednom trenutku prestane da se koristi, neophodno je da se ona oslobodi. Oslobađanje memorije se vrši pozivom funkcije free, kojoj se kao argument prosleđuje pokazivač na memoriju koja se oslobaća.

free(pokazivacNaMemoriju);

Ukoliko se memorija ne oslobodi, a na nju više ne pokazuje nijedna promenljiva, ona je za program izgubljena. Ovo se naziva curenjem memorije. Dopuštanje curenja memorije se smatra lošom programerskom praksom, jer ukoliko program duže vremena radi, a iznova i iznova alocira memoriju koju nakon upotrebe ne oslobađa, program će bez potrebe koristiti sve više i više memorijskih resursa.

Srodne funkcije

uredi

Valja znati da malloc samo pronalazi slobodan blok memorije odgovarajućve veličine, i vraća pokazivač na njega. Nije poznato šta se u tom bloku memorije nalazi (tu se nalaze podaci koji su ranije bili upisani u taj segment memorije), pa se ne smeju praviti bilo kakve pretpostavke o sadržaju te memorije. U slučaju potrebe, umesto funkcije malloc, moguće je pozvati njoj srodnu funkciju calloc, koja radi na isti način kao i malloc sem što alocirani blok memorije ispunjava nulama.

Ukoliko se ispostavi da alocirani blok memorije nije dovoljno veliki (recimo, potrebno je proširiti niz), dostupna je funkcija realloc, kojoj se prosleđuje pokazivač na blok memorije koji je potrebno proširiti i zahtevana nova veličina bloka. Ova funkcija pronalazi na hipu novi blok memorije odgovarajuće veličine, i u njega prepisuje sadržaj starog, manjeg bloka.

Vidi još

uredi

Spoljašnje veze

uredi