Documente online.
Zona de administrare documente. Fisierele tale
Am uitat parola x Creaza cont nou
 HomeExploreaza
upload
Upload




Variabilele dinamice

Informatica


Variabilele dinamice

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: hand-up

Comenteaza documentul:

Nu esti inregistrat
Trebuie sa fii utilizator inregistrat pentru a putea comenta


Creaza cont nou

A fost util?

Daca documentul a fost util si crezi ca merita
sa adaugi un link catre el la tine in site


in pagina web a site-ului tau.




eCoduri.com - coduri postale, contabile, CAEN sau bancare

Politica de confidentialitate | Termenii si conditii de utilizare




Copyright © Contact (SCRIGROUP Int. 2024 )