Malloc() – In questa lezione utilizzeremo la funzione malloc in C per l’allocazione dinamica della memoria.
Quindi proponiamo un semplice programma che prende in input un array di 10 elementi e calcoli la media degli elementi.
Dapprima vediamo le possibili soluzioni senza l’utilizzo della funzione malloc in C.
Ecco dunque una possibile soluzione.
#include <stdio.h>
#define N 10
int main () {
int a[N], i;
float media;
for(i=0;i<N; i++) {
printf("Elemento %d: ", i+1);
scanf("%d", &a[i]) ;
}
media=0;
for(i=0;i<N;i++)
media+=a[i];
media/=N;
printf("La media e': %d", media );
return 0;
}
Pertanto in questo esempio è possibile effettuare la media solo dei 10 elementi precedentemente stabiliti.
Se volessimo ad esempio effettuare la media di 20 elementi allora dovremmo modificare la costante N e ricompilare il programma.
Si potrebbe allora chiedere all’utente di quanti numeri voler effettuare la media, per avere una soluzione più flessibile.
....
int n;
printf("Quanti valori?" );
scanf("%d ", &n);
int a[n];
....
Ma questa soluzione non è corretta, in quanto n è noto solo a tempo di esecuzione (ovvero dopo che l’utente lo inserisce da tastiera e lo leggiamo tramite scanf).
Allora una delle possibili soluzioni è il sovradimensionamento dell’array, soluzione che in definitiva abbiamo utilizzato finora.
Magari facendo un controllo dell’input per permettere valori di n compresi tra 1 e 1000.
Ecco dunque la soluzione sempre senza l’utilizzo della funzione malloc in C.
#include <stdio.h>
#define MAX 1000
int main () {
int a[MAX], i, media;
int n;
do {
printf("Quanti valori?");
scanf("%d", &n);
} while (n<0 && n>1000);
for(i=0;i<n; i++) {
printf("Elemento %d: ", i+1);
scanf("%d", &a[i]) ;
}
media=0;
for(i=0;i<n;i++)
media+=a[i];
media/=n;
printf("La media e': %d", media);
return 0;
}
Chiaramente, come potete intuire, il problema è lo spreco di memoria.
Allocazione dinamica – utilizzo di malloc in C
Quindi quale approccio più efficiente potremmo utilizzare?
Sicuramente l’allocazione dinamica della memoria con l’utilizzo della funzione malloc, che ci permette di utilizzare un vettore formato da un numero di elementi uguale a quelli da elaborare.
Ecco dunque il listato completo con l’utilizzo di malloc in C.
#include <stdio.h>
#include <stdlib.h>
int main () {
int *a, i, n;
float media;
a=(int *) malloc(sizeof(int));
printf("Quanti valori?" );
scanf("%d", &n);
for(i=0;i<n; i++) {
printf("Elemento %d: ", i+1);
scanf("%d", &a[i] ) ;
}
media=0;
for(i=0;i<n;i++)
media+=a[i];
media/=n;
printf("La media e': %.2f" , media );
return 0;
}
In questo modo alloco la quantità necessaria esattamente per elaborare n interi: a=(int *) malloc(sizeof(int)).
Anche in questo esempio potremmo prima controllare se l’allocazione avviene correttamente, controllando che a sia diverso da NULL.
Ancora non ho introdotto le altre funzioni free, realloc e calloc. Presto ne faremo uso.
Chiaramente questo era solo un semplice esempio d’utilizzo della funzione malloc in C.
Alcuni link utili
Somma elementi diagonale principale di una matrice
Come sommare gli elementi della cornice esterna
Sommare dei numeri di una matrice
Ricerca elementi in una matrice