Fonction calloc

Entête à  inclure

#include <stdlib.h>  // <cstdlib> en C++

Fonction calloc

void * calloc( size_t number, size_t byteSize );

Cette fonction a quasiment le même comportement que la fonction malloc : elle alloue dans le tas (le heap, en anglais) un bloc de mémoire (qui devra être libéré par le programmeur). Cependant, deux détails diffèrent. Tout d'abord, l'invocation de cette fonction requière deux paramètres (contre un seul pour malloc) : on alloue en fait un espace mémoire pouvant contenir un certain nombre de blocs contigus de même taille .

Autre détail, calloc se charge aussi d'initialiser la zone de mémoire allouée en y mettant tout les octets à la valeur 0 (ce qui n'est pas le cas de malloc). N'oubliez surtout pas de libérer la mémoire après utilisation.

Paramètres

  • number: permet de déterminer le nombre de blocs consécutifs à  allouer.
  • byteSize : permet de fixer la taille (en nombre d'octets) d'un des blocs de mémoire. Au final, la zone de mémoire allouée occupera donc number * byteSize octets.

Dans le cas ou le bloc de mémoire ne pourrait vous être réservé (plus de mémoire disponible, par exemple), le pointer NULL vous sera retourné. On derait normalement et systématiquement tester que l'on ait pas cette valeur. Néanmoins cela n'est pas toujours fait par les développeurs. Donc un petit conseil, utilisez au moins un assert.

Valeur de retour

Si tout ce passe bien, la fonction vous renvoie un pointeur sur la zone nouvellement allouée. Attention, ce pointeur est de type pointeur générique (void *) : si nécessaire, il est donc de votre responsabilité de "caster" votre pointeur vers un autre type (du moins si vous souhaitez ne pas avoir de warning affiché pas le compilateur, ce que je vous recommande vivement).

Exemple de code

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

#define INT_NUMBER 10

int main() {
    
    int i;
    int * pointer = (int *) calloc( INT_NUMBER, sizeof(int) );

    /* Un petit test sur le bon fonctionnement de calloc */
    assert( pointer != NULL );

    /* Le dernier élément du tableau ne sera pas affecté par la */
    /* boucle mais n'oubliez pas que calloc initialise de toute */
    /* façon à 0 chaque octet. */
    for ( i=0; i<INT_NUMBER-1; i++ ) {
        pointer[i] = i;
    }

    /* On affiche le contenu du tableau d'entier */
    /* Ce qui donne : 0 1 2 3 4 5 6 7 8 0 */
    for (i=0; i<INT_NUMBER; i++ ) {
        printf( "%d ", pointer[i] );
    }
    printf( "\n" );

    /* On libère le bloc de mémoire alloué dynamiquement */
    free( pointer );

    return 0;
}

Sujets connexes