Download as pdf or txt
Download as pdf or txt
You are on page 1of 4

Limbaje de Programare

Laboratorul 8: Alocarea dinamică a memoriei


Dan Novischi
10 aprilie 2017

1. Introducere
Scopul acestui laborator este lucrul cu memoria dianamică a unui program C, lucrul cu
funct, iile pentru alocarea/dealocarea memoriei s, i utilizarea memoriei alocate pentru rezolva-
rea unor probleme din laboratoarele anterioare.

Alocarea s, i de-alocarea memoriei se poate realiza ı̂n limbajul C prin intermediul a patru
funct, ii din biblioteca stdlib.h a caror headere sunt prezentate mai jos.

1 /* Aloca un bloc de memorie cu un numar de size octeti. */


2 void* malloc (unsigned int size);
3

4 /*
5 * Aloca un bloc de memorie cu un numar de elemente (num)
6 * si mariemea in octeti a unui element (size).
7 */
8 void* calloc (unsigned in num, unsigned int size);
9

10 /* Redimensioneaza un bloc de meorie la size */


11 void* realloc (void * ptr, unsigned int size);
12

13 /* Dealoca memoria data de pointerul ptr */


14 void free (void* ptr);

1
2. Exemple de programe
1 /* Crearea si afisarea unui vector de patrate
2 * pana la un anumit numar intreg n folosind
3 * functia malloc.
4 */
5 #include <stdio.h>
6 #include <stdlib.h>
7

8 int main(void)
9 {
10 int *pv; // pointer care va stoca
11 // adresa de iceput a memeoriei alocate
12 int i,n;
13

14 // Citeste numarul n de la tastatura


15 printf("n = ");
16 scanf("%d",n);
17 printf("\n");
18

19 // Aloca vectorul de n elemente


20 pv = (int*) malloc(n*sizeof(int));
21

22 // Populeaza vectorul de patrate pana la n


23 for(i = 0; i < n; i++){
24 pv[i] = i*i;
25 }
26

27 // Afisieaza elementele vectorului


28 for(i = 0; i < n; i++){
29 printf("pv[%d] = %d\n", i, pv[i]);
30 }
31

32 // Dealoca vectorul
33 free(pv);
34

35 return 0;
36 }

2
1 /* Crearea unui string (sir de caractere) dinamic */
2 #include <stdio.h>
3 #include <stdlib.h>
4

5 int main(){
6 char *str;
7

8 /* Allocare initiala la 15 elemente char */


9 str = (char *) malloc(15*sizeof(char));
10 strcpy(str, "Re-alocare");
11 printf("String = %s\n, str);
12

13 /* Re-alocare pana la 25 de elemente char*/


14 str = (char *) realloc(str, 25*sizeof(char));
15 strcat(str, " string");
16 printf("String = %s\n", str);
17

18 free(str);
19 return 0;
20 }

3
3. Cerint, e
Cerint, a 1 (4p) Să se scrie un program pentru ordonarea unor nume de persoane citite de
la tastură respectand următoarele cerint, e:

a) Numele de persone vor fi memorate inttr-un array dinamic.

b) Apelat, i functia prezentată mai jos pentru a sorta array-ul.

c) Afis, ati fiecare nume din array-ul sortat pe cate o linie.

1 void bubleSort(char** strs, int len){


2 int i, j;
3 char *aux;
4 for(i = 0; i < len -1; i++)
5 for(j = 0; j < len - i -1; j++)
6 if(strcmp(strs[j], strs[j+1]) > 0){
7 aux = strs[j];
8 strs[j] = strs[j+1];
9 strs[j+1] = aux;
10 }
11 }

Cerint, a 2 (6p) Să se realizeze un program care sa inmult, easca o matrice cu un vector
respectand următoarele cerint, e:

a) Matricea va fi alocată dinmaic ca un array 1D, iar elementele acesteia se vor accesa
folosind aritmetica cu pointeri.

b) Pentru citirea matricii si respectiv a vectorului se vor creea s, i utiliza funct, iile
readMatrixFromKB(...) s, i readVectorFromKB(...) similare celor de la curs.

c) Pentru inmult, irea matricii a cu vectorul x se va implemta funct, ia cu următorul antet:

1 float* multiplyMatrixVector(float *a, float *x, int rows, int cols);

care returnează un nou vector reprezentand rezultatul inmult, irii.

d) Pentru afis, area matricii s, i a vectorilor se vor creea s, i utiliza funct, iile writeMatrix(...)
s, i writeVector(...) similare celor de la curs.

e) Se vor de-aloca corespunzator toate datele alocate dinamic.

You might also like