Documente Academic
Documente Profesional
Documente Cultură
Multe aplicații pot fi optimizate dacă memoria necesară stocării datelor lor este alocată dinamic
în timpul execuției programului. Alocarea dinamică de memorie înseamnă alocarea de zone de
memorie și eliberarea lor în timpul execuției programelor. Zona de memorie în care se alocă, la
cerere, datele dinamice este diferită de zona de memorie în care se alocă datele statice (stiva de
date) şi se numește heap.
Spațiul de memorie alocat dinamic la cerere este accesibil programatorului printr-un pointer
care conține adresa sa. Pointerul care indică un obiect de pe heap este de regulă stocat într-o
variabilă alocată static.
#inlcude<stdio.h>
int total; Iată un program care are 2 funcții.
int Square(int x) Prima Square() cu un argument, ne returnează patratul unui număr.
{ Square_Sum() –cu 2 argumente, returnează suma a 2 numere.
Return x*x; Să presupunem că stiva de jos reprezintă memoria programului în timpul execuției.
} Cînd programul începe să se execute, funcția
int Square_Sum (int x, int y) main() este implicată pentru prima operație,
{ astfel se va aloca memoria pentru ea in Stack.
int z= Square (x+y);
return z; Toate variabilele locale, argumentele și
} datele care trebuie să fie returnate sunt
int main () stocate aici în stack-frame. Mărimea acestui
{ stack este calculat atunci când programul este dat
Int a=4, b=8; la compilare.
total=Square_Sum(a,b);
Printf(”output =%d”,total);
}
1
Se va relua funcția main(), apoi instrucțiunea printf() apare în top la stack și se
execută. Printf () este eliberată din memorie, revine în main() și mai apoi și main () se
eliberează din memorie. Apoi se șterge și variabila globala total. Nu era necesar să utilizăm
această variabilă locală. Utilizăm variabile globale numai în cazul când e necesar de folosit
în diferite părți ale programului. În caz contrar irosim spațiu de memorie pe tot parcursul
programului.
2
#include <stdio.h>
#include<stdlib.h>
int main()
{
int a; // goes on stack
int *p;
p=(int *) malloc sizeof(int)); // to reserve on a heap , give me a bloc of memory
2 //bytes of int.
// ii alocam un block de memorie din heap. Dar ea este goala. Adresa 200
*p=10;// daca vrem sa-I dam o valoarea atunci ii atribuim valoarea .
/*daca dorim să alocăm spațiu unui tablou de tip int cu 20 elemente in heap, totul ce
facem e sa apelam funcția */
p=(int *)malloc(20 * sizeof(int));/* cerând un bloc cu 20 de elemente de tip int, unde
pointerul arata spre prima adresa a elementului tabloului. */
/*Un lucru important aici, dacă nu putem să alocăm memorie dinamica cuiva se va
returna NULL. */
}
3
void *p=malloc (4)// radnomly alocate 4 bytes
printf(”p=”,p); // 208
De ce alocăm aleatoriu?
De ce noi alocăm spațiu de memorie? Noi alocăm memorie pentru a stoca careva date in
heap. Nu dorim să alocam aleatoriu spațiu de memorie. Trebuie să știm exact căt alocăm.
Dacă dorim să alocăm pentru un int (stim că fiecare bloc are un byte) atunci utilzăm
expresia:
*p=2;
*(p+1)=4;
…
*(p+1);
Ori
p[0]=2;
p[1]=4;
…
p[i]=x;
4
Alocarea de memorie pentru un vector şi inițializarea zonei alocate cu zerouri se poate face cu funcția calloc.
În timp ce funcția malloc() ia un singur parametru (o dimensiune în octeţi), funcția calloc() primeşte două argumente, o
lungime de vector şi o dimensiune a fiecărui element.
Realoc.
Realocarea unui vector care creşte (sau scade) faţă de dimensiunea estimată anterior se poate face cu funcţia realloc, care
primeşte adresa veche şi noua dimensiune şi întoarce noua adresă