Alocarea,realocarea si eliberarea dinamica a memoriei in limbajul C
Funcia malloc permite alocarea unui bloc de memorie a crui dimensiune se specific n octei. Funcia returneaz un pointer spre nceputul zonei alocate. ntruct acest pointer trebuie s permit memorarea oricrui tip de dat n zona alocat, el este de tip void *. Prototipul funciei este: void *malloc (unsigned n); unde n este numrul de octei al zonei de memorie care se aloc. n cazul n care n este prea mare, funcia returneaz pointerul NULL. Exemplu: int *p; p = malloc(5 * sizeof (int) ); malloc va aloca 5*4=20 de octeti Funcia free elibereaz o zon de memorie alocat prin malloc. Prototipul ei este: void free (void *p); unde p este pointerul returnat de malloc la alocare, deci este pointerul spre nceputul zonei care se elibereaz. Functia realloc Prototipul functiei realloc este: void *realloc(void *p, size_t dimensiune); Functia realloc modifica marimea unui spatiu pentru date deja existente. p este un pointer catre o zona de memorie deja alocata. Daca p este NULL functia realloc functioneaza ca si malloc, alocand un bloc de atatia octeti cati sunt precizati de dimensiune. Daca p nu este NULL atunci p trebuie sa fie un pointer returnat de un apel anterior al uneia din functiile malloc, calloc sau realloc. Parametrul dimensiune determina noua marime in octeti a blocului de memorie alocat. Exemplu: array = (int*) realloc (array, 20 * sizeof(int));
2. Alocarea dinamic a memoriei pentru un tablou unidimensional int *alocare(int n){ int *a; a=(int*)malloc(n*sizeof(int)); return a;
3. Tablou unidimensional de pointeri. Pointer la pointer Tablou unidimesnional de pointeri ---
Pointer la pointer- n primul rnd un pointer este o variabil, la fel ca orice alt variabil, dar care deine adresa unei variabile. Un pointer la un pointer este o variabil, la fel ca orice alt variabil, dar care are o valoare adresa pointer lui. Declaraia de un pointer pointer arata astfel **p;
4. Alocarea dinamic a memoriei pentru un tablou bidimensional folosind tabloul unidimensional de pointeri
http://stackoverflow.com/questions/13295318/allocate-a-2d-array-in-c-with-one- dimension-fixed priviti sa vedeti daca corect am gasit. Sau int main(void) { 1. // your code goes here 2. int *(a)[10]; 3. int i; 4. for (i = 0; i < 10; i++) 5. { 6. a[i] = (int*)malloc(10 * sizeof(int)); 7. } 8. return 0; 9. }
5. Tabloul bidimensional alocat static. Pointer la tablou unidimensional
1. #include <stdio.h> 2. 3. int main(void) { 4. // your code goes here 5. int a[10][10]; 6. int **pa = &a[0]; 7. return 0; 8. } 9.
6. Alocarea dinamic a memoriei pentru un tablou bidimensional folosind pointer la pointer main () { int ** a; int i, j, nl, nc; printf ("nr. linii="); scanf ("%d",&nl); printf ("nr. col. ="); scanf ("%d",&nc); // memorie pentru vectorul de pointeri la linii a = (int**) malloc (nl*sizeof(int*)); for (i=0; i < nl; i++) // aloca memorie pentru fiecare linie i a[i] = (int*) calloc (nc, sizeof(int)); //
7. Trimiterea n funcie tabloului bidimensional alocat dinamic
int **alocare_dinamica_a_tabloului(int n, int m) /*Functie ce returneaza un pointer la pointer (tabel bidimensional) da tocinee adresa in memorie unde se alfa A[0][0]*/ { int **A; /*se declara un pointer la pointer (tabel bidimensional)*/ int i; A=malloc(n*sizeof((*A)));/*Pointerului A se aloca memorie cu n pointeri la int(numarul de rinduri )*/ if(A==NULL) /*daca n=0,tabelul are 0 rinduri,rezulta ca lui A nu o sa i se aloce memorie sh nu se returneaza nimic*/ { return A; /*se returneaza A=NULL, adica nimic*/ } for(i=0;i<n;i++) /*Amu avem un tabel de n pointeri la int*/ { A[i]=malloc(m*sizeof(int)); /*pentru fiecare din n pointeri la int se aloca memorie pentru m intregi (coloanele), la momentu dat avem un tabel de n linii sh m coloane cu intregi*/ if(A[i]==NULL) /*in caz cind avem m=0, tabelu are n linii sh 0 coloane, atunci tabelu ii imposibil de alocat sh se returneaza NULL*/ { return NULL; } } return A;}
8 Trimiterea n funcie tabloului bidimensional alocat static
1. #include <stdio.h> 2. 3. // cu matricile alocate static doar asa poti 4. // indicele [10] e obligatoriu sa fie ca 5. // in matricea care a fost creata in afara functiei 6. void test(int a[][10]) 7. { 8. a[0][0] = 2; 9. } 10. 11. int main(void) { 12. // your code goes here 13. int a[10][10]; 14. 15. a[0][0] = 1; 16. printf("%d", a[0][0]); 17. test(a); 18. printf("%d", a[0][0]); 19. return 0; 20. }
9. Tipul CHAR reprezint o mulime finit i ordonat de caractere din setul ASCII ( American Standard Code for Information Interchange ) extins. Declararea unui tablou de caractere se face astfel: char nume_tablou[dimensiune_maxim]; Exemple: char sir[20]; // tablou de 20 de caractere char t[10]; // tablou de 10 de caractere 10, 13.Functiile standart pentru introducerea de la tastatura a unui character sint: a) scanf (argumentul) c) getch () e) get (sir) b) getchar () d) getche () 11, 14.Functiile standart pentru afisarea pe ecran a unui caracter sint : a) printf (argumentul) c) putch () b) putchar () d) puts (sir) 15.Functiile din biblioteca standar pentru prelucrarea caracterolor si a string-urilor sint: a) strlen (nume_sir) - returneaz un numr ntreg ce reprezint lungimea unui ir de caractere, fr a numra terminatorul de ir b) strcmp (sir_1, sir_2) - funcia compar cele dou iruri date ca argument i returneaz o valoare ntreag egal cu diferena dintre codurile ASCII ale primelor caractere care nu coincid. c) strcpy (sir_destinatie, sir_sursa) - funcia copiaz irul surs n irul destinaie. d) strcat (sir_destinatie, sir_sursa) - funcia concateneaz cele dou iruri: irul surs este adugat la sfritul irului destinaie 16.Clasificarea tipurilor de date ale limbajului C:
16. Clasificarea tipurilor de date ale limbajului C. 1-tipuri de date fundamentale: integer, are sintaxa : int var1; are 4 bytes, +,- 2^32, adica 32 bites floating, sintaxa, float var1, are 4 bytes,precizia de 6 cifre; double var2; are 8 bytes, precizia de 14 cifre character, char var1='a'; are 1 byte, caracterele sunt amplasate intrun tablou ASCII, fiecare caracter avind valearea liu de exemplu 'a'=97...
17. Tipuri de date definite de utilizator. Caracteristica general
18. Tipul de date structura. Declaraia a unui tip de date structura i a variabilelor de tip structura. Utilizarea instruciunei typedef structurile sunt colectii de variabile de diferite tipui sub un singur nume,aceasta se face pentru a controla variabilile despre ceva care sunt relationate intre ele mai usor, struct person { char name[50]; int cit_no; float salary; };
Inside main function: struct person p1, p2, p[20]; sau struct person { char name[50]; int cit_no; float salary; }p1 ,p2 ,p[20];
typedef se foloseste petru a crea niu tipuri de date definite de programatror typedef struct complex{ int imag; float real; }comp;
Inside main: comp c1,c2;
19. Cmpurile structurei. Operaiuni de acces la cmpurile structurei. Operaiunea de atribuire pentru variabile de tip structura cimpurile structurei se refera la membriei, la care se face cces cu acutorul ","(punctului) 20. Tabloul unidimensional de structuri. Baza de date n forma de tablou de structuri. Operaiuni de prelucrare a tabloului de structuri #include<stdlib.h> #include<stdio.h> #include<conio.h>
21. Ciclu infinit i instruciunea switch pentru menu de operaiuni de prelucrare a tabloului de structuri ciclul infinit in C poate fi realizat de mai multe forme, fie cu instructiunea while, de exemplu while(1){...}; va crea un cilcu infinit, sau prin for, cu co nditia care niciodata se va opri, e exemplu for(i=5;i<0;i--){....}; instructiuena switch se foloseste atunci cin deste nevoie de a fi aleasa o parte a codului din mai multe alternative care paote rula, de ecemplu un menu, aceasta de poate executa si prin fuctiile if...else, dar switch face programul mai complex, swithc se declara de forma: switch (expression) { case constant1: codes to be executed if expression equals to constant1; break; case constant2: codes to be executed if expression equals to constant3; break; . . . default: codes to be executed if expression doesn't match to any cases; } cinditia functiei switch arata care parte a codului se va executa, daca conditia nu este indeplinita atunci se executa defoult. 22. Tipul de date union. Declaraia a unui tip de date union i a variabilelor de tip union. Utilizarea instruciunei typedef uniunile sunt similare structurilor in C,sunt un tip derivat de la structuri,sunt declarate similar structurilor: union car{ char name[50]; int price; };
23. Cmpurile variabilei de tip union. Operaiuni de acces i de atribuire. Deosebiri pentru variabile de tip structura i de tip union deosebirea uniunilor de structura este cantitatea memoriei utilizate pentru a aloca informatia.uninunile aloca memorie doar mariea cea mai mare a variabilei din interior. toti membrii unei structuri pot fi accesati oricind, dar la uniuni doar un membru poate fi accesat in acelasi timp,ceilalti vor contine gunoi, adica uniunea va contine doar o informatie a unui menbru al sau, ceilalti menbru nu vor contine nimic. 24. Argumentele (parametrii) funciei main( ) La lansarea programului in executie din sistemul de operare in linia de comanda se pot transmite informatii (argumente) catre programul respectiv. Declaratia functiei main in acest caz are forma generala:
unde argc specifica numarul de argumente, avand o valoare 1; argv[] este un tablou de pointeri catre siruri de carcatere reprezentand aceste argumente introduse in linia de comanda la lansarea programului si despartite prin spatiu sau TAB. Intotdeauna argv[0] indica sirul de caractere nume program, argv[1] indica sirul de carcatere primul argument, etc. env[] este un tablou de pointeri reprezentand o lista de parametri ai sistemului de operare, ultimul pointer din tablou avand valoarea NULL.