In questa lezione parleremo della funzione calloc in C, che è molto utile per l’allocazione dinamica di array.
Nell’esempio precedente abbiamo utilizzato malloc per allocare un array, che è comunque una funzione molto utilizzata anche per tale scopo.
Malloc non inizializza la memoria a zero, dobbiamo farlo esplicitamente, oppure utilizziamo la funzione calloc. Infatti la funzione calloc inizializza ogni byte del blocco di memoria a zero.
La sintassi della funzione calloc in C è la seguente:
void *calloc(size_t num, size_t dim)
Quindi la funzione prevede due argomenti, il primo rappresenta il numero di elementi da allocare mentre il secondo la quantità di memoria per ogni elemento.
Se ad esempio vogliamo allocare un vettore di n elementi di tipo intero, possiamo utilizzare calloc:
int *a;
a=(int *) calloc(n,sizeof(int));
Il puntatore punterà al primo elemento di un vettore di n elementi interi.
Possiamo anche utilizzare malloc in questo modo:
int *a;
a=(int *) malloc(n*sizeof(int));
Sia calloc che malloc restituiscono NULL se non riescono ad allocare la quantità di memoria richiesta, ad esempio perché esaurita.
Esempio di utilizzo di calloc in C
Riproponiamo l’esempio del calcolo della media che abbiamo visto nella lezione precedente, al fine di comparare i due metodi.
Ecco dunque il listato completo che fa uso della funzione calloc, per allocare dinamicamente la memoria.
#include <stdio.h>
#include <stdlib.h>
int main () {
int *a, i, n;
float media;
a=(int *) calloc(n,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=media+a[i];
media/=n;
printf ("La media e': %.2f" , media );
return 0;
}
Anche qui si potrebbe effettuare un test sul contenuto del puntatore, in modo tale che, se l’allocazione non avviene correttamente (per esempio se non abbiamo sufficiente spazio di memoria), compaia un messaggio di avviso.
Chiaramente questo è solo un semplice esempio di utilizzo della funzione calloc in C per allocare la memoria dinamicamente.
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