Curs 8 Doc

download Curs 8 Doc

of 15

Transcript of Curs 8 Doc

  • 7/23/2019 Curs 8 Doc

    1/15

    INFORMATIC*I* IB.10Alocarea memoriei n limbajul C

    - 1 -

    Capitolul IB.10. Alocarea memoriei n limbajul C

    Cuvinte cheieClase de memorare, alocare static, alocare dinamic, variabile

    auto, variabile locale, variabile globale, variabile register, funciistandard, vectori de pointeri, sructuri alocate dinamic

    IB.10.1. Clase de memorare (alocare a memoriei) n C

    Clasa de memorarearat cnd, cum i undese aloc memorie pentru o variabil.

    Orice variabil are o clas de memorare care rezult fie din declaraiaei, fie implicit din locul

    unde este definit variabila.

    Zona de memorie utilizat de un program C cuprinde 4 subzone:Zona text: n care este pstrat codul programuluiZona de date: n care sunt alocate (pstrate) variabilele globaleZona stiv: n care sunt alocate datele temporare (variabilele locale)Zona heap: n care se fac alocrile dinamice de memorie

    Moduri de alocare a memoriei:Static:variabile implementate n zona de date - globale

    Memoria este alocat la compilare n segmentulde date din cadrul programului i nu se mai poate modifican cursul execuiei. Variabilele externe, definite n afara funciilor, sunt implicit statice, dar pot fi declaratestatici variabile locale, definite n cadrul funciilor.

    Auto: variabile implementate n stiv - locale

    Memoria este alocat automat, la activarea unei funcii, n zona stiv alocat unui program i este eliberatautomat la terminarea funciei. Variabilele locale unui bloc (unei funcii) i parametrii formali sunt implicitdin clasa auto. Memoria se aloc n stiva ataat programului.

    Dinamic: variabile implementate n heapMemoria se aloc dinamic (la execuie) n zona heapataat programului, dar numai la cererea explicit aprogramatorului, prin apelarea unor funcii de bibliotec (malloc, calloc, realloc). Memoria este eliberatnumai la cerere, prin apelarea funcieifree

    Register: variabile implementate ntr-un registru de memorie

    IB.10.2. Clase de alocare a memoriei: Auto

    Variabilele locale unui bloc (unei funcii)iparametrii formali sunt implicit din clasa auto.Durata de via a acestor variabile este temporar: memoria este alocat automat, la activareablocului/funciei, n zona stiv alocat programului i este eliberat automat la ieirea dinbloc/terminarea funciei. Variabilele locale NU sunt iniializate! Trebuie s le atribuim o valoareiniial!

    Exemplu:int doi() {

    int x = 2;return x;

    }int main() {

    int a;{

    int b = 5;a = b*doi();

  • 7/23/2019 Curs 8 Doc

    2/15

    INFORMATIC*I* IB.10Alocarea memoriei n limbajul C

    - 2 -

    }printf(a = %d\n, a);return 0;

    }

    Coninut stiv:(x) 2(b) 5(a) 10

    IB.10.3. Clase de alocare a memoriei: Static

    Memoria este alocat la compilare n segmentul de date din cadrul programului i nu se mai poatemodifica n cursul execuiei.Variabilele globale sunt implicitstatice(din clasastatic).Pot fi declaratestatic i variabile locale, definite n cadrul funciilor, folosind cuvntul cheie static.O variabil sau o funcie declarat (sau implicit) static are durata de via egal cu cea a

    programului. In consecin, o variabil static declarat ntr-o funcie i pstreaz valoarea ntreapeluri succesive ale funciei, spre deosebire de variabilele auto care sunt realocate pe stiv lafiecare apel al funcieii pornesc de fiecare dat cu valoarea primit la iniializarea lor (sau cu ovaloare imprevizibil, dac nu sunt iniializate).Exemple:int f1() {

    int x = 1; /*Variabil local, iniializat cu 1 la fiecareapel al lui f1*/

    ......}

    int f2() {static int y = 99; /*Variabil local static,iniializat cu 99

    doar la primul apel al lui f2; valoarea ei estereinut pe parcursul apelurilor lui f2*/

    ......}

    int f() {static int nr_apeluri=0;nr_apeluri++;printf("funcia f() este apelata pentru a %d-a oara\n, nr_apeluri);return nr_apeluri;

    }int main() {

    int i;for (i=0; i

  • 7/23/2019 Curs 8 Doc

    3/15

    INFORMATIC*I* IB.10Alocarea memoriei n limbajul C

    - 3 -

    // afisare intreg in binarvoid binar ( int x) {

    int n=digits(x); //functie care intoarce nr-ul de cifre al lui xint d=pw10 (n-1); //functie care calculeaza 10 la o putere intreagawhile ( x >0) {

    printf("%d",x/d); //scrie catul impartirii lui x prin dx=x%d;d=d/10; //continua cu x = x%d si d = d/10

    }}

    Toate variabilele externe (i statice) sunt automat iniializate cu valori zero (inclusiv vectorii).Cuvntul cheiestaticface ca o variabil global sau o funcie s fie privat(proprie) unitii unde afost definit: ea devine inaccesibil altei uniti, chiar prin folosirea lui extern.

    Cantitatea de memorie alocat pentru variabilele cu nume rezult din tipul variabilei i dindimensiunea declarat pentru vectori. Memoria alocat dinamic este specificat explicit ca parametrual funciilor de alocare,n numr de octei.

    Memoria neocupat de datele statice i de instruciunile unui program este mprit ntre stivi

    heap.Consumul de memoriestack(stiva) este mai mare n programele cu funcii recursive (numr marede apeluri recursive).Consumul de memorie heap este mare n programele cu vectori i matrice alocate (i realocate)dinamic.De observat c nu orice vector cu dimensiune constant este un vectorstatic; un vector definit ntr-ofuncie (alta dect main) nu este static deoarece nu ocupmemorie pe toat durata de execuie a

    programului, dei dimensiunea sa este stabilit la scrierea programului. Un vector definit ntr-ofuncie este alocat pe stiv, la activarea funciei, iar memoria ocupat de vector este eliberatautomat la terminarea funciei.

    Sintez variabile locale / variabile globaleO sintez legat de variabilele locale i cele globale din punct de vedere al duratai de via vs.domeniu de vizibilitate este dat n tabelul urmtor:

    Variabile globale Variabile locale

    Alocare Static; la compilare Auto; la execuie bloc

    Durata de via Cea a ntregului program Cea a blocului n care e declarat

    IniializareCu zero Nu se face automat

    IB.10.4. Clase de alocare a memoriei: Register

    A treia clas de memorare este clasa register,pentru variabile crora li se aloc registre ale procesorului i nulocaii de memorie, pentru un timp de acces mai bun.

    O variabil declarat register solicit sistemului alocarea ei ntr-un registru main, dac esteposibil.De obicei compilatorul ia automat decizia de alocare a registrelor mainii pentru anumite variabileautodin funcii.Se utilizeaz pentru variabile foarte solicitate, pentru mrirea vitezei de execuie.

    Exemplu:

    {register int i;for(i = 0; i < N; ++i){

  • 7/23/2019 Curs 8 Doc

    4/15

    INFORMATIC*I* IB.10Alocarea memoriei n limbajul C

    - 4 -

    /* */}

    } /* se elibereaza registrul */

    IB.10.5. Clase de alocare a memoriei: extern

    O variabil extern este o variabil definit n alt fiier. Declaraia extern i spune compilatorului cidentificatorul este definit n alt fiier surs (extern). Ea este este alocat n funcie de modul dedeclarare din fiierul surs.

    Exemplu:

    // File1.cppextern int i; // Declara aceasta variabila ca fiind definita in alt fisier

    // File2.cppint i = 88; // Definit aici

    IB.10.6. Alocarea dinamic a memoriei

    Reamintim c pentru variabilele alocate dinamic memoria se aloc dinamic (la execuie) n zonaheap ataat programului, dar numai la cererea explicit a programatorului, prin apelarea unorfuncii de bibliotec (malloc, calloc, realloc). Memoria este eliberat numai la cerere, prin apelareafuncieifree.Principalele diferene ntre alocarea static i cea dinamic sunt:

    La alocarea static, compilatorul aloc i elibereaz memoria automat, ocupndu-se astfel degestiunea memoriei, n timp ce la alocarea dinamic programatorul este cel care gestioneazmemoria, avnd un control deplin asupra adreselor de memorie i a coninutului lor.

    Entitile alocate static sau auto sunt manipulate prin intermediul unor variabile, n timp ce cele alocatedinamicsunt gestionate prin intermediul pointerilor!

    IB.10.6. 1 Funcii standard pentru alocarea dinamic a memorieiFunciile standard pentru alocarea dinamica a memoriei sunt declarate n fiierelestdlib.hi alloc.h.

    Alocarea memoriei:

    void *malloc(size_t size);Aloc memorie de dimensiuneasize octei

    void *calloc(int nitems, size_t size);

    Aloc memorie pentru nitemsde dimensiune size octei i iniializeaz zona alocat cuzerouri

    Cele dou funcii au ca rezultat adresa zonei de memorie alocate (de tip void.Dac cererea de alocare nu poate fi satisfcut, pentru c nu mai exista un bloc continuu dedimensiunea solicitat, atunci funciile de alocare au rezultatNULL. Funciile de alocare au rezultatvoid*deoarece funcia nu tie tipul datelor ce vor fi memorate la adresa respectiv.La apelarea funciilor de alocare se folosesc:

    Operatorul sizeof pentru a determina numrul de octei necesar unui tip de date(variabile);Operatorul de conversie castpentru adaptarea adresei primite de la funcie la tipuldatelor memorate la adresa respectiv (conversie necesar atribuirii ntre pointeri detipuri diferite).

  • 7/23/2019 Curs 8 Doc

    5/15

    INFORMATIC*I* IB.10Alocarea memoriei n limbajul C

    - 5 -

    Exemple://aloca memorie pentru 30 de caractere:char * str = (char*) malloc(30);

    //aloca memorie ptr. n ntregi:int * a = (int *) malloc( n * sizeof(int));

    //aloca memorie ptr. n ntregi si initializeaza cu zerouriint * a= (int*) calloc (n, sizeof(int) );

    IB.10.6. 2 Realocarea memoriei

    Realocarea unui vector care crete (sau scade) fa de dimensiunea estimat anterior se poate facecu funcia realloc, care primete adresa veche i noua dimensiune i ntoarce noua adres:void *realloc(void* adr, size_t size);

    Funcia reallocrealizeaz urmtoarele operaii:Aloc o zon de dimensiunea specificatprin al doilea parametru.

    Copiaz la noua adres datele de la adresa veche (primulparametru).Elibereaz memoria de la adresa veche.

    Exemple:// dublare dimensiune curenta a zonei de la adr. aa = (int *)realloc (a, 2*n* sizeof(int));

    Atenie!Se va evita redimensionarea unui vector cu o valoare foarte mic de un numr mare de ori;o strategie de realocare folosit pentru vectori este dublarea capacitii lor anterioare.Exemplu de funcie cu efectul funciei realloc,dar doar pentru caractere:char * ralloc (char * p, int size) { // p = adresa veche

    char *q; // q=adresa nouaif (size==0) { // echivalent cu free

    free(p);return NULL;

    }q = (char*) malloc(size); // aloca memorieif (q) { // daca alocare reusita

    memcpy(q,p,size); // copiere date de la p la qfree(p); // elibereaza adresa p

    }return q; // q poate fi NULL

    }

    Observaie:La mrirea blocului, coninutul zonei alocate n plus nu este precizat, iar la micorarea

    blocului se pierd datele din zona la care se renun.

    IB.10.6. 3 Eliberarea memorieiFunciafreeare ca argument o adres (un pointer) i elibereaz zona de la adresa respectiv (alocatdinamic). Dimensiunea zonei nu mai trebuie specificat deoarece este memorat la nceputul zoneialocate (de ctre funcia de alocare):

    void free(void* adr);

    Eliberarea memoriei prin free este inutil la terminarea unui program, deoarece nainte dencrcarea i lansarea n execuie a unui nou program se elibereaz automat toat memoria heap.

    Exemple:char *str;

  • 7/23/2019 Curs 8 Doc

    6/15

    INFORMATIC*I* IB.10Alocarea memoriei n limbajul C

    - 6 -

    str=(char *)malloc(10*sizeof(char));str=(char *)realloc(str,20*sizeof(char));free(str);

    Observaie:

    Atenie la definirea de iruri n mod dinamic! irul respectiv trebuie iniializat cu adresa unui alt ir sau aunui spaiu alocat pe heap (adic alocat dinamic)!

    Exemple:char *sir3;char ir1[30];

    // Varianta 1: sir3 ia adresa unui ir staticsir3 = sir1; // Echivalent cu: sir3=&sir1; sir3=&sir1[0];char *sir4="test"; //sir4 este iniializat cu adresa unui ir constant

    // Varianta 2: se alocdinamic un spaiu pe heap

    sir3=(char *)malloc(100*sizeof(char));

    Exemplu

    Program care alocspaiu pentru o variabilntreagdinamic, dupcitire i tiprire, spaiul fiindeliberat. Modificai programul astfel nct variabila dinamic sfie de tip double.

    Rezolvare

    #include #include

    int main(){

    int *pi;pi=(int *)malloc(sizeof(int));if(pi==NULL){

    puts("*** Memorie insuficienta ***");return 1; // revenire din main

    }

    printf("valoare:");//citirea variabilei dinamice, de pe heap, de la adresa din pi!!!scanf("%d",pi);*pi=*pi*2; // dublarea valoriiprintf("val=%d,pi(adresa pe heap)=%p,adr_pi=%p\n", *pi, pi, &pi);

    // sizeof aplicat unor expresii:printf("%d %d %d\n",sizeof(*pi), sizeof(pi), sizeof(&pi));

    free(pi); //eliberare spatiuprintf("pi(dupa elib):%p\n",pi); // nemodificat, dar invalid!return 0;

    }

    IB.10.7. Vectori alocai dinamic

    Structura de vector are avantajul simplittii i economiei de memorie fa de alte structuri de datefolosite pentru memorarea unei colecii de date.

  • 7/23/2019 Curs 8 Doc

    7/15

    INFORMATIC*I* IB.10Alocarea memoriei n limbajul C

    - 7 -

    Dezavantajul unui vector cu dimensiune fix (stabilit la declararea vectorului i care nu mai poatefi modificat la execuie) apare n aplicaiile cu vectori de dimensiuni foarte variabile, n care estedificil de estimat o dimensiune maxim,fr a face risip de memorie.De cele mai multe ori programele pot afla din datele citite dimensiunile vectorilor cu care lucreazi deci pot face o alocare dinamic a memoriei pentru aceti vectori. Aceasta este o soluie maiflexibil, care folosete mai bine memoria disponibil i nu impune limitri arbitrare asupra

    utilizrii unor programe.

    n limbajul C nu exist practic nici o diferen ntre utilizarea unui vector cu dimensiune fix iutilizarea unui vector alocat dinamic, ceea ce ncurajeaz si mai mult utilizarea unor vectori cudimensiune variabil.

    Un vector alocat dinamic se declar ca variabil pointer care se iniializeaz cu rezultatul funciei dealocare. Tipul variabilei pointer este determinat de tipul componentelor vectorului.

    Exemplu:#include #include

    int main() {int n, i;int * a;

    // adresa vector alocat dinamic

    printf ("n=");scanf ("%d", &n); // dimensiune vectora=(int *) calloc (n,sizeof(int)); // aloca memorie pentru vector

    // sau: a=(int*) malloc (n*sizeof(int));

    // citire component vector:

    printf ("componente vector: \n");for (i=0;i

  • 7/23/2019 Curs 8 Doc

    8/15

    INFORMATIC*I* IB.10Alocarea memoriei n limbajul C

    - 8 -

    v = (float *)malloc (n*sizeof(float)); //alocare initiala

    while (scanf("%f",&x) !=EOF){if (n_crt == n) {n = n + INCR;v = (float *) realloc (v, n*sizeof(float) ); //realocare}v[n_crt++] = x;

    }for (i=0; i

  • 7/23/2019 Curs 8 Doc

    9/15

    INFORMATIC*I* IB.10Alocarea memoriei n limbajul C

    - 9 -

    return p;}

    void printmat (int ** a, int nl, int nc) {int i,j;

    for (i=0;i

  • 7/23/2019 Curs 8 Doc

    10/15

    INFORMATIC*I* IB.10Alocarea memoriei n limbajul C

    - 10 -

    Atenie! Acest pointer nu trebuie s conin adresa unei variabile locale, deoarece:

    O variabil local are o existen temporar, garantat numai pe durata executrii funciei n careeste definit (cu excepia variabilelor locale statice)Adresa unei astfel de variabile nu trebuie transmis n afara funciei, pentru a fi folosit ulterior!!

    Exemplu greit:// vector cu cifrele unui nr intreg de maxim cinci cifre

    int * cifre (int n) {

    int k, c[5]; // vector local

    for (k=4;k>=0;k--) {

    c[k]=n%10; n=n/10;

    }

    return c; // aici este eroarea !

    }

    //warning la compilare i POSIBIL rezultate greite n main!!

    O funcie care trebuie s transmit carezultat un vector poate fi scris corect n n mai multe feluri:

    1. Primete ca parametru adresa vectorului (definit i alocat n alt funcie) i depunerezultatele la adresa primit (este soluia recomandat!!)

    void cifre (int n, int c[ ]) {

    int k;

    for (k=4;k>=0;k--) {

    c[k]=n%10; n=n/10;

    }

    }

    int main(){

    int a[10];

    .cifre(n,a);

    .

    }

    2. Aloc dinamic memoriapentru vector (cu "malloc")

    Aceast alocare (pe heap) se menine i la ieirea din funcie.Funcia are ca rezultat adresa vectorului alocat n cadrul funciei.Problema este unde i cnd se elibereaz memoria alocat.

    int * cifre (int n) {

    int k, *c; // vector local

    c = (int*) malloc (5*sizeof(int));

    for (k=4;k>=0;k--) {

    c[k]=n%10; n=n/10;

    }

    return c; // corect

    }

    3. O soluie oarecum echivalent este utilizarea unui vector local static, care continu s existe idup terminarea funciei.

  • 7/23/2019 Curs 8 Doc

    11/15

    INFORMATIC*I* IB.10Alocarea memoriei n limbajul C

    - 11 -

    IB.10.10. Vectori de pointeri la date alocate dinamic

    Ideea folosit la matrice alocate dinamic este aplicabil i pentru alte date alocate dinamic: adreseleacestor date sunt reunite ntr-un vector de pointeri. Situaiile cele mai frecvente sunt:

    vectori de pointeri la iruri de caractere alocate dinamicvectori de pointeri la structuri alocate dinamic.

    Exemplu de utilizare a unui vector de pointeri la structuri alocate dinamic:

    #include#include

    typedef struct {int zi, luna, an;

    } date;

    // afisare date reunite n vector de pointerivoid print_vp ( date * vp[], int n) {

    int i;

    for(i=0;izi, vp[i]->luna, vp[i]->an);

    printf ("\n");}

    int main () {date d, *dp;date *vp[100];int n=0;

    while (scanf ("%d%d%d", &d.zi, &d.luna, &d.an) {dp=(date*)malloc (sizeof(date)); // alocare dinamica ptrstructur

    *dp=d;// copiaza datele citite la dp

    vp[n++]=dp;// memoreaza adresa in vector

    }print_vp (vp,n);

    }

    De reinut c trebuie create adrese distincte pentru fiecare variabil structur i c ar fi greit spunem adresa variabilei dn toate poziiile din vector!

    Este posibil i varianta urmtoare pentru ciclul principal din main dac cunoatem numrul de

    elemente din structur:....scanf (%d,&n); // numar de structuri ce vor fi cititefor (k=0; kzi, &dp->luna, &dp->an)vp[n++]=dp; // memoreaza adresa in vector

    }....

    ExempluProgram pentru citirea unor nume, alocare dinamic a memoriei pentru fiecare ir (n funcie de

    lungimea irului citit) i memorarea adreselor irurilor ntr-un vector de pointeri. n final se vorafia numele citite, pe baza vectorului de pointeri.

  • 7/23/2019 Curs 8 Doc

    12/15

    INFORMATIC*I* IB.10Alocarea memoriei n limbajul C

    - 12 -

    Sse adauge programului anterior o funcie de ordonare a vectoruluide pointeri la iruri, pe bazaconinutului fiecrui ir. Programul va afia lista de nume n ordine alfabetic.a. Vectorului de pointeri i se va aloca o dimenisune fix.

    b. Vectorul de pointeri se va aloca dinamic, funcie de numrul de iruri.

    Rezolvare a:

    void printstr ( char * vp[], int n) { //afisareint i;for(i=0;i

  • 7/23/2019 Curs 8 Doc

    13/15

    INFORMATIC*I* IB.10Alocarea memoriei n limbajul C

    - 13 -

    IB.10.11. Anexa A: Structuri alocate dinamic

    n cazul variabilelor structur alocate dinamic i care nu au nume se va face o indirectare printr-un pointerpentru a ajunge la variabila structur.

    Avem de ales ntre urmtoarele dou notaii echivalente:pt->camp (*pt).campundepteste o variabil care conine un pointer la o structur cu cmpul camp.

    O colecie de variabile structur alocate dinamic se poate memora n dou moduri:

    Ca un vector de pointeri la variabilele structur alocate dinamic;Ca o list nlntuit de variabile structur, n care fiecare element al listei conine i un cmpde legtur ctre elementul urmtor (ca pointer la structur).

    Pentru primul mod de memorare a se vedea Vector i de pointer i la date alocate dinamic.

    Liste nlnuite

    O list nlnuit (linked list) este o colecie de variabile alocate dinamic (de acelai tip),dispersate n memorie, dar legate ntre ele prin pointeri, ca ntr-un lan. ntr-o list liniar simplunlnuit fiecare element al listei conine adresa elementului urmtor din list. Ultimul element

    poate conine ca adres de legatur fie constanta NULL, fie adresa primului element din list (listacircular).

    Adresa primului element din list este memorat ntr-o variabil cu nume i numit cap de lista(list head). Pentru o list vid variabila cap de list este NULL.

    Structura de list este recomandat atunci cnd colecia de elemente are un coninut foarte variabil(pe parcursul execuiei) sau cnd trebuie pstrate mai multe liste cu coninut foarte variabil.

    Un element din list (un nod de list) este de un tip structur i are (cel puin) dou cmpuri:

    un cmp de date (sau mai multe)un cmp de legtur

    Definiia unui nod de list este o definitie recursiv, deoarece n definirea cmpului de legturse

    folosete tipul n curs de definire.Exemplu pentru o list de ntregi:

    typedef struct snod {int val ; // camp de datestruct snod * leg ; // camp de legatura

    } nod;

    Programul urmtor arat cum se poate crea i afisa o list cu adugare la nceput (o stiv realizat ca listnlnuit):

    int main ( ) {

  • 7/23/2019 Curs 8 Doc

    14/15

    INFORMATIC*I* IB.10Alocarea memoriei n limbajul C

    - 14 -

    nod *lst=NULL, *nou, * p; // lst = adresa cap de listaint x;// creare lista cu numere cititewhile (scanf("%d",&x) > 0) { // citire numar intreg x

    nou=(nod*)malloc(sizeof(nod));// creare nod nounou->val=x; // completare camp de date din nodnou->leg=lst; lst=nou; // legare nod nou la lista

    }// afisare list (fara modificare cap de lista)p=lst;while ( p != NULL) { // cat mai sunt noduri

    printf("%d ", p val); // afisare numar de la adr pp=p->leg; // avans la nodul urmator

    }}

    Cmpul de date poate fi la rndul lui o structur specific aplicaiei sau poate fi un pointer la datealocate dinamic (un ir de caractere, de exemplu).De obicei se definesc funcii pentru operaiile uzuale cu liste.

    Exemple:

    typedef struct nod { // un nod de lista inlantuitaint val; // date din fiecare nodstruct snod *leg; // legatura la nodul urmator

    } nod;

    // insertie la inceput listanod* insL( nod* lst, int x) {

    nod* nou ; // adresa nod nouif ((nou=(nod*)malloc(sizeof(nod)))==NULL)return NULL;nou->val=x;

    nou->leg=lst;return nou; // lista incepe cu nou

    }

    // afisare continut listavoid printL ( nod* lst) {

    while (lst != NULL) {printf("%d ",lst->val); // scrie informatiile din nodlst=lst->leg; // si se trece la nodul urmtor

    }}

    int main () { // creare si afisare lista stiva

    nod* lst; int x;lst=NULL; // initial lista e vidawhile (scanf("%d",&x) > 0)

    lst=insL(lst,x); // introduce pe xin lista lstprintL (lst); // afisare lista

    }

    Alte structuri dinamice folosesc cte doi pointeri sau chiar un vector de pointeri; ntr-un arborebinar fiecare nod conine adresa succesorului la stnga i adresa succesorului la dreapta, ntr-unarbore multici fiecare nod conine un vector de pointeri ctre succesorii acelui nod.

  • 7/23/2019 Curs 8 Doc

    15/15

    INFORMATIC*I* IB.10Alocarea memoriei n limbajul C

    - 15 -

    IB.10.11. Anexa B: Operatori pentru alocare dinamic in C++

    n C++ s-au introdus doi operatori noi:pentru alocarea dinamic a memoriei newpentru eliberarea memoriei dinamice delete

    destinai s nlocuiasc funciile de alocare i eliberare.Operatorul new are ca operand un nume de tip, urmat n general de o valoare iniial pentruvariabila creat (ntre paranteze rotunde); rezultatul lui new este o adres (un pointer de tipulspecificat) sauNULLdaca nu exist suficient memorie liber.

    Exemple:nod * pnod; // pointer la nod de lista

    pnod = new nod; // alocare fara iniializare

    int * p = new int(3); // alocare cu iniializare

    Operatorul new are o form puin modificat la alocarea de memorie pentru vectori, pentru aspecifica numrul de componente.

    Exemplu:int * v = new int [n]; // vector de n intregi

    Operatorul deleteare ca operand o variabil pointer i are ca efect eliberarea blocului de memorieadresat de pointer, a crui mrime rezult din tipul variabilei pointer sau este indicat explicit.

    Exemple:int * v;

    delete v; // elibereaza sizeof(int) octei

    delete [ ] v;

    delete [n] v; // elibereaza n*sizeof(int) octei

    Exemplu de utilizare newi delete pentru un vector de ntregi alocat dinamic:

    #include #include

    int main() {const int SIZE = 5;int *pArray;

    pArray = new int[SIZE]; // alocare memorie

    // atribuie numere aleatoare intre 0 and 99

    for (int i = 0; i < SIZE; i++) {*(pArray + i) = rand() % 100;

    }

    // afisarefor (int i = 0; i < SIZE; i++) {

    cout