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.
#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
#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;}$ gcc -Wall -Wextra -g zeros.c -o zeros$ ./zeros0 0 0Pièges
Croire que
callocest juste «mallocplus 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'estcalloc(nmemb, size), deux dimensions.Compter sur
0.0ouNULLpour les flottants et les pointeurs : vrai en pratique, non garanti par la norme.Oublier le free(3) : un bloc de
callocse libère exactement comme un bloc demalloc.
calloc
Écris gm_calloc à partir de malloc : renvoie NULL si nmemb * size déborde, sinon mets à zéro chaque octet du nouveau bloc.