Allocazione dinamica della memoria con la funzione calloc in C

Come abbiamo visto nella pagina precedente, in C è possibile utilizzare delle apposite funzioni per allocare in maniera dinamica la memoria. Questa funzionalità ci permette di dichiarare le dimensioni delle variabili a runtime, invece di a compilation time, cioè consente di utilizzare solamente lo spazio di memoria strettamente necessario, rendendo più efficiente il programma.

In particolare, abbiamo visto il funzionamento di base della funzione malloc che ci permette di allocare una certa quantità di memoria nello spazio di memoria chiamato heap. Però, oltre alla malloc esiste un’altra funzione che permette di allocare dinamicamente lo spazio di memoria in C, ovvero la funzione calloc. Per poter utilizzare la calloc è necessario includere nell’header del file la libreria stdlib.h, mentre di seguito viene riportata la sua sintassi:void *calloc(size_t n, size_t size);

dove il parametro n indica il numero di elementi da allocare, mentre size indica la dimensione in byte di ciascun elemento. La funzione calloc, in caso di successo, restituisce il puntatore all'inizio dello spazio di memoria allocato, mentre in caso di errore, restituisce NULL.

Nota: bisogna ricordarsi che la gestione dell’heap nel linguaggio C è lasciata al programmatore, questo significa che al termine dell’utilizzo della variabile allocata dinamicamente, bisogna liberare lo spazio di memoria occupato utilizzando la funzione free().

Differenza tra la funzione malloc e la funzione calloc in C

Le funzioni malloc e calloc a prima vista possono risultare molto simili, ed in effetti lo sono, ma le due funzioni differiscono principalmente nella maniera in cui essi inizializzano lo spazio allocato in memoria. Mentre la funzione malloc non inizializza lo spazio in memoria, ovvero gli elementi possiedono un valore non definito, la funzione calloc inizializza ogni byte, allocato dinamicamente in memoria, al valore 0.

Un’altra differenza sta nel fatto che, la funzione calloc richiede due valori in input: il numero di elementi e la loro dimensione in byte; mentre la malloc richiede solo di indicare lo spazio di memoria totale da allocare.

Esempio di utilizzo della funzione calloc in C

Di seguito viene riportato un esempio di utilizzo della funzione calloc in C, in particolare il programma chiede all’utente di inserire la dimensione di un array di interi e successivamente di inserire i suoi valori. Per ottenere un programma di questo tipo abbiamo bisogno di allocare dinamicamente la memoria, in quanto la dimensione dell’array viene specificata a runtime, cioè quando il programma è già in esecuzione.

Per allocare lo spazio in memoria facciamo uso della funzione calloc, che richiede due parametri in input: il numero di elementi, specificato dall’utente, e la dimensione in byte di ciascun elemento. Per ottenere il valore di quest’ultimo parametro, facciamo uso della funzione sizeof, la quale restituisce la dimensione in byte del tipo di dato passato (nel nostro caso di tipo int).

A questo punto chiediamo all’utente di riempire l’array con dei valori da tastiera e al termine stampiamo a schermo i valori contenuti nell’array. Prima del termine dell’esecuzione del programma, ma dopo aver usato l’array, dobbiamo ricordarci di liberare lo spazio di memoria allocato precedentemente.



#include <stdio.h>
#include <stdlib.h>

int main(){
    int *a, dim;
    
    printf("Indica la dimensione dell'array: ");
    scanf("%d", &dim);
    
    a = calloc(dim, sizeof(int));
    
    if(a == NULL){
        printf("Errore durante allocazione memoria!\n");
        return -1;
    }
    
    for(int i=0; i<dim; i++){
        printf("Inserisci elemento in posizione %d: ", i);
        scanf("%d", &a[i]);
    }
    
    printf("\n");
    
    for(int i=0; i<dim; i++){
        printf("%d ", a[i]);
    }
    
    free(a);

   return 0;
}


Indica la dimensione dell'array: 3 Inserisci l'elemento in posizione 0: 2 Inserisci l'elemento in posizione 1: 4 Inserisci l'elemento in posizione 2: 6 2 4 6

Indice pagine linguaggio C: