calloc(3)

Fonction de la bibliothèque C

Alloue un tableau de nmemb éléments de size octets, met tout à zéro et vérifie que le produit nmemb * size ne déborde pas. Renvoie NULL en cas d'échec.

Synopsis
#include <stdlib.h>
void *calloc(size_t nmemb, size_t size);

Description

calloc réserve de la place pour un tableau de nmemb éléments de size octets chacun, et fait deux choses que malloc(3) ne fait pas. D'abord, il met tous les octets à zéro : la norme C23 dit que l'espace est « initialized to all bits zero ». Ensuite, il prend les deux dimensions séparément, et refuse l'allocation si leur produit déborde. La formulation de C23 est explicite : calloc renvoie un pointeur « or a null pointer if the space cannot be allocated or if the product nmemb * size would wraparound size_t ».

C'est cette deuxième garantie qui fait de calloc le bon choix dès qu'une des dimensions vient de l'extérieur. malloc(nmemb * size) calcule le produit toi-même, et un produit qui déborde donne un petit nombre : tu alloues quelques octets en croyant en avoir des milliards, puis tu écris au-delà. C'est un vrai trou de sécurité, pas une curiosité théorique.

Attention au « all bits zero » : sur les machines courantes, un pointeur et un double à zéro valent bien NULL et 0.0, mais la norme ne le promet pas. Pour des entiers et des caractères, zéro est zéro, sans réserve.

Valeur de retour

L'adresse du bloc mis à zéro, ou NULL si l'allocation échoue ou si nmemb * size déborde. Comme pour malloc, teste ce retour avant de t'en servir.

Exemple

zeros.c
#include <stdio.h>#include <stdlib.h>
int main(void){    int *scores = calloc(3, sizeof(int));
    if (scores == NULL)        return 1;    printf("%d %d %d\n", scores[0], scores[1], scores[2]);    free(scores);    return 0;}
Terminal
$ gcc -Wall -Wextra -g zeros.c -o zeros$ ./zeros0 0 0

Pièges

  • Croire que calloc est juste « malloc plus lent » : la mise à zéro et la vérification de débordement sont des garanties utiles, pas du gaspillage.

  • Confondre l'ordre des arguments avec memset : c'est calloc(nmemb, size), deux dimensions.

  • Compter sur 0.0 ou NULL pour les flottants et les pointeurs : vrai en pratique, non garanti par la norme.

  • Oublier le free(3) : un bloc de calloc se libère exactement comme un bloc de malloc.

C

calloc

Écris gm_calloc à partir de malloc : renvoie NULL si nmemb * size déborde, sinon mets à zéro chaque octet du nouveau bloc.

Ouvrir l'exercice

À toi d'écrire le code.