libri-javascript-python

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

Media per riga e per colonna

Somma elementi diagonale principale di una matrice

Come sommare gli elementi della cornice esterna

Come sommare due matrici

Sommare dei numeri di una matrice

Matrice trasposta

Prodotto tra matrici

Ricerca elementi in una matrice

Inserire dati in una matrice

Tavola pitagorica in C

Array multidimensionali

Programma sui triangoli in C

Media dei numeri in un array

Array con numeri random

Quick sort in C

Selection sort in C

Merge sort in C

Insertion Sort in C