This is an old revision of the document!


Laboratorul 02: Alocare dinamica, structuri

Obiective

În urma parcurgerii acestui laborator studentul va fi capabil:

  • să aloce dinamic o zonă de memorie;
  • să elibereze o zonă de memorie;
  • să lucreze cu vectori și matrice alocate dinamic.

1. Alocare dinamică

Funcțiile standard de alocare și eliberare a memoriei sunt declarate în biblioteca <stdlib.h>:

  • void* malloc(size_t );
  • void* calloc(size_t , size_t );
  • void* realloc(void *, size_t );
  • void free(void*)

Alocarea memoriei

Funcția malloc are drept rezultat adresa zonei de memorie alocate (de tipul void* ) și ca argument, dimensiunea zonei de memorie alocate, exprimate în octeți. Dacă există suficient spatiu liber in HEAP, atunci un bloc de memorie continuu de dimensiunea specificată va fi marcat ca ocupat, iar funcția malloc va returna un pointer ce conține adresa deînceput a acelui bloc. Dacă nu există spațiu pentru a se face alocarea, funcția malloc întoarce NULL. Accesarea blocului alocat se realizează printr-un pointer către adresa de început a blocului.

Exemplu - malloc

char *str = malloc(10);            // Aloca memorie pentru 10 de caractere
int *a = malloc(n * sizeof(int)); // Aloca memorie pentru n numere intregi

Funcția free are drept argument o adresă (un pointer) și eliberează zona de la adresa respectivă

Funcția calloc; dacă există suficient spațiu liber în HEAP, atunci un bloc de memorie continuu va fi marcat ca ocupat, iar funcția calloc va returna un pointer ce conține adresa de început a acelui bloc

Exemplu - calloc

int *v;   
int n=3;
v=(int*)calloc(n,sizeof(int)); // Aloca spațiu pentru n=3 întregi și îi inițializez cu 0

Funcția realloc void * realloc( void *p, int dim ); dacă există suficient spațiu în HEAP, atunci un bloc de memorie continuu cu dimensiunea dim specificată va fi marcat ca ocupat. AStfel, funcția realloc returnează un pointer ce conține adresa de început a acelui bloc. Se copiază la noua locație conținutul blocului inițial și se eliberează memoria de la vechea adresă.

Dacă nu există suficient spațiu liber, realloc întoarce NULL, iar pointerul inițial rămâne nemodificat.

2. Structuri de date

O structură de date reprezintă un mod de a organiza și stoca o colecție de date; pentru a facilita manipularea elementelor din colecție este recomandată sortarea colecției. În funcție de modul în care sunt organizate elementele, se pot identifica:

  1. Structuri de date liniare:
    • Tablouri - elemente stocate în locații succesive de memorie la care se știe adresa primului element
    • Liste - elemente stocate în locații nesuccesive de memorie
    • Stive - elemente stocate în locații nesuccesive de memorie la care se aplică principiul LIFO (Last In First Out) - ultimul element adăugat este primul procesat
    • Cozi - elemente stocate în locații nesuccesive de memorie la care se aplică principiul FIFO (First In First Out) - primul element adăugat este primul procesat
  2. Structuri de date neliniare:
    • Arbori - favorizează păstrarea unor colecții de elemente sub formă ierarhică în stare sortată
    • Grafuri - favorizează conexiunile dintre elemente
sda-ab/laboratoare/02.1610477493.txt.gz · Last modified: 2021/01/12 20:51 by marina.ciocirlan
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0