Alocarea statică a memoriei


    În C există posibilitatea alocării memoriei atât mod static, cât şi dinamic. Prin alocare
statică înţelegem faptul că memoria este alocată automat încă de la pornirea execuţiei
instrucţiunilor unei funcţii, iar eliberarea memoriei se face tot automat la părăsirea funcţiei. Cu
alte cuvinte, când se intră într-o funcţie (inclusiv funcţia main) se face alocarea statică a
memoriei, iar eliberarea se face la părăsirea acelei funcţii. Lungimea zonei de memorie alocate
static este constantă, adică de fiecare dată când se intră cu execuţia într-o funcţie, se alocă
automat acelaşi număr de octeţi.
Spre deosebire de alocarea statică, în cazul alocării dinamice stabilim noi momentul
alocării memoriei şi lungimea zonei de memorie alocate. De asemenea, putem decide momentul
în care să se facă eliberarea memoriei.
Pentru un vector putem aloca memorie în mod static sub forma tip
numevector[lungimev], unde lungimev este o constantă numerică care reprezintă numărul de
elemente (căsuţe de memorie) al vectorului.
Dăm câteva exemple de alocări statice de memorie pentru vectori:
# define N 100
....
float a[10],b[N];
int i,n,vect[N+1];
Elementele unui vector în C au indici între 0 şi lungimev-1. De exemplu, vectorul a
definit mai sus are elementele: a[0], a[1], … , a[9].
Dacă se trece de capetele 0 şi lungimev-1 ale vectorului a, în C nu se semnalează în
general eroare. Astfel se poate accesa elementul a[-1] (zona de memorie aflată cu o căsuţă în
stânga lui a[0]) sau se poate accesa a[lungime]. Acest lucru poate conduce la blocarea
programului sau la alterarea altor date reţinute în memorie la adresele respective, pe care le-am
accesat greşit!
În declaraţia numevector[lungimev], numevector este un pointer care reţine adresa de
început a zonei de memorie alocate static pentru vector (elementele vectorului se reţin în căsuţe
succesive de memorie). Cu alte cuvinte, pointerul a reţine adresa la care se află memorat primul
element a[0] al vectorului a, iar a+1 este adresa la care se află elementul a[1], a+2 este adresa
lui a[2] etc. De asemenea, *a este tot una cu a[0], *(a+1) este a[1] etc. În general, a[k]
reprezintă o scriere simplificată pentru *(a+k).

0 comentarii:

Trimiteți un comentariu