Variabilelor
globale li se aloca memorie in timpul compilarii. Variabilele locale folosesc
memoria stiva fiind create de la inceperea executiei blocului ce le contine si
sunt distruse la iesirea din blocul respectiv. Dar nici variabilele globale
nici cele locale nu pot fi create in timpul executiei programului.
In cazul
structurilor de date a c 454i84e aror dimensiune nu se cunoaste apriori, zona de memorie
folosita se aloca prin program, in timpul executiei, si este eliberata tot prin
program, atunci cand nu mai este necesara, pentru a fi utilizata in alt scop.
Variabilele create astfel se numesc variabile dinamice. Pentru acest tip
de variabile este utilizata zona de memorie numita heap care este
situata intre zona permanenta de memorie a programului si memoria stiva.
Limbajul C++
contine un set bogat de functii pentru alocarea si eliberarea memoriei in
timpul executiei programului. Prototipurile acestora se afla in fisierele
alloc.h si stdlib.h. cele mai uzuale sunt functiile malloc()si calloc(), pentru
alocarea memoriei si free(), pentru eliberarea de memorie. Aceste functii
lucreaza in pereche folosind zona de memorie libera pentru a stabilii si a
pastra o lista cu memoria disponibila.
Sintaxa functiilorei malloc
si calloc este urmatoarea:
void *calloc(size_t,
size_t);
void*malloc(size_t numar_de_octeti);
size_t
- este un tip predefinit in fisierele stdlib.h aproximativ ca un intreg
unsigned;
numar_de_octeti
- este numarul de octeti din memorie care se doreste a fi alocat.
Deoarece
pointerul returnat de aceste functii are tipul 'void', acesta poate
fi asignat altor pointeri fara conversie explicita (cast). Totusi unele sisteme
nu accepta aceasta conversie, deci ea trebuie facuta explicit. Octetii
rezervati de 'calloc()' sunt automat initializati cu 0, pe cand cei
rezervati cu 'malloc()' nu sunt initializati (deci vor avea valori
'garbage'). Numele 'calloc', respectiv 'malloc',
provine de la 'contiguous allocation', respectiv 'memory
allocation'.
Functia
malloc() returneaza un pointer de tip void, ceea ce inseamna ca se poate
atribui oricarui tip de pointer. Dupa o apelare reusita, malloc( ) returneaza
un pointer spre primul octet al regiuinii de memorie alocate in memoria libera.
Daca nu exista suficienta memorie disponibila pentru a satisface cerinta
functiei malloc(), apare o blocare de alocare, iar functia returneaza null.
Obs.
In C++, la atribuire, este necesara o conversie de tip cu operatorul. De
exemplu, la alocarea memoriei pentru 5 valori de tip int se procedeaza astfel:
int
*p;
p=(int*)malloc(5*sizeof(int));
Atunci
cand spatiul alocat nu mai
este util, eliberarea memoriei de catre programator se poate face cu functia
free() a carei sintaxa este urmatoarea:
void*free(void*pointer);
unde
pointer indica adresa zonei ce trebuie eliberata.
Obs.
Apelarea functiei free() cu un argument
impropriu distruge lista din memoria libera.
Deoarece
memoria nu este infinita, cand se aloca memorie trebuie sa se verifice valoarea
returnata de functia malloc() inainte de a folosi pointerul pentru a fi siguri
ca nu este null, utilizarea unui pointer null blocand programul.
Ex.
if (!(p=malloc(100)))
Functia exit(
este cea care se foloseste la iesirea din rutina in momentul cand nu este suficienta
memorie.
14.
Probleme ale pointerilor
Un
pointer eronat este dificil
de depistat deoarece nu pointerul insusi constitue problema. Necazul este ca de
fiecare data cand se efectueaza o operatie folosind un pointer gresit se
citeste sau se scrie intr-o zona de memorie necunoscuta. La citire cel mai rau
lucru care se poate intampla este obtinerea unor valori gresite. Problema este
la scriere deoarece apare posibilitatea scrierii peste alte zone ale codului
sau in zona de memorie unde sunt
inscrise datele. Acest lucru nu se vede imediat ci mai tarziu, an timpul
executiei programului, greseala putand fi cautata in alta parte, nenexistand
aproape nici o dovada care sa sugereze ca pointerul este cauza initiala a
problemei. De aceea in continuare sunt prezentate cateva greseli uzuale:
1.
Neinitializarea pointerului.
Void
main ()
Acest
program aloca valoarea 10 unei locatii de memorie necunoscute deoarece daca
pointerului p nu i s-a dat o valoare initiala, el contine o valoare necunoscuta
in momentul atribuirii.
Neintelegerea modului
de folosire a unui pointer
3. Presupunerea incorecta
asupra amplasarii variabilelor in memorie.
Nu se poate sti niciodata unde vor fi plasate in memorie datele din program. De
aceea compararea intre pointeri care nu indica acelasi obiect poate determina
rezultate neasteptate.
4.
Indexarea a doua matrici alaturate ca si cum ar fi una singura prin simpla
incrementare a pointerului peste granitele matricelor.
Nereinitializarea pointerilor atunci cand
sunt folositi in instructiuni ciclice.
Document Info
Accesari:
4942
Apreciat:
Comenteaza documentul:
Nu esti inregistrat Trebuie sa fii utilizator inregistrat pentru a putea comenta