Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Alocarea dinamica a memoriei

c



+ Font mai mare | - Font mai mic



Alocarea dinamica a memoriei

Exista doua metode principale prin care un program C poate memora informatii in memoria principala a calculatorului.



Prima metoda foloseste variabilele globale si locale. In cazul variabilelor globale, memoria ce li se aloca este fixa pe tot timpul executiei programului. Pentru variabilele locale, programul aloca memorie in spatiul stivei, in timpul executiei programului. Desi variabilele locale sunt eficient de implementat, in C, de multe ori, utilizarea acestora, necesita cunoasterea in avans a cantitatii de memorie necesare in fiecare situatie.

A doua metoda de alocare a memoriei, consta in utilizarea functiilor de alocare dinamica malloc() si free(). Prin aceasta metoda, un program aloca memorie pentru diversele informatii in spatiul memoriei libere numita heap, plasata intre programul util si memoria sa permanenta si stiva. Se observa ca stiva creste in jos, iar dimensiunea acesteia depinde de program.

Un program cu multe functii recursive va folosi mult mai intens stiva in comparatie cu un program ce nu utilizeaza functii recursive, aceasta deoarece adresele de retur si variabilele locale corespunzatoare acestor functii sunt salvate in stiva.

Functiile malloc() si free()

Aceste functii formeaza sistemul de alocare dinamica a memoriei in C si fac parte din fisierul antet <stdlib.h>. Acestea lucreaza impreuna si utilizeaza zona de memorie libera plasata intre codul program si memoria sa permanenta (fixa) si varful stivei, in scopul stabilirii si mentinerii unei liste a variabilelor memorate. De fiecare data cand se face o cerere de memorie, functia malloc() aloca o parte din memoria ramasa libera. De fiecare data cand se face un apel de eliberare a memoriei, functia free() elibereaza memorie sistemului.

Declararea functiei malloc() se face sub forma:

void *malloc (int numar_de_bytes);

Aceasta intoarce un pointer de tip void, ceea ce inseamna ca trebuie utilizat un sablon explicit de tip atunci cand pointerul returnat de malloc() se atribuie unui pointer de un alt tip. Daca apelul lui malloc() se executa cu succes, malloc() va returna un pointer la primul byte al zonei de memorie din heap ce a fost alocata. Daca nu este suficienta memorie pentru a satisfce cererea malloc(), apare un esec si malloc() returneaza NULL. Pentru determinarea exacta a numarului de bytes necesari fiecarui tip de date, se poate folosi operatorul sizeof(). Prin aceasta, programele pot deveni portabile pe o varietate de sisteme.

Functia free() returneaza sistemului memoria alocata anterior cu malloc(). Dupa eliberarea memoriei cu free(), aceasta se poate reutiliza folosind un apel malloc().

Declararea functiei free() se realizeaza sub forma:

free(void *p);

Functia free() elibereaza spatiul indicat de p si nu face nimic daca p este NULL. Parametrul actual p trebuie sa fie un pointer la un spatiu alocat anterior cu malloc(), calloc() sau realloc().

Exemplu: Urmatorul program va aloca memorie pentru 40 de intregi, va afisa valoarea acestora, dupa care elibereaza zona, utilizand free():

# include <stdio.h>

# include <stdlib.h>

void main(void) }

Functiile calloc() si realloc()

Functia calloc() aloca un bloc de n zone de memorie, fiecare de dim octeti si seteaza la 0 zonele de memorie; functia returneaza un pointer la acel bloc (adresa primului octet din bloc). Declararea functiei se face cu:

void *calloc(unsigned int n, unsigned int dim);

Functia realloc() primeste un pointer la un bloc de memorie alocat in prealabil (declarat pointer de tip void) si redimensioneaza zona alocata la dim octeti (daca este nevoie, se copiaza vechiul continut intr-o alta zona de memorie). Declararea functiei se face cu:

void *realloc(void *ptr, unsigned int dim);



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 1000
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved