Il n'y a aucune différence dans la taille du bloc de mémoire alloué. calloc
remplit simplement le bloc de mémoire avec un motif physique de zéro. Dans la pratique, on suppose souvent que les objets situés dans le bloc de mémoire alloué avec calloc
ont une valeur initiale comme s'ils avaient été initialisés avec un littéral 0
, c'est-à-dire que les entiers devraient avoir la valeur de 0
, les variables à virgule flottante - la valeur de0.0
, les pointeurs - la pointeur nul appropriée , etc.
Du point de vue pédant cependant, calloc
(ainsi que memset(..., 0, ...)
) n'est garanti que pour initialiser correctement (avec des zéros) les objets de type unsigned char
. Tout le reste n'est pas garanti d'être correctement initialisé et peut contenir ce qu'on appelle une représentation d'interruption , ce qui provoque un comportement non défini. En d'autres termes, pour tout type autre que unsigned char
le motif tout-à-zéro susmentionné, il pourrait représenter une valeur illégale, une représentation d'interruption.
Plus tard, dans l'un des rectificatifs techniques à la norme C99, le comportement a été défini pour tous les types d'entiers (ce qui est logique). Autrement dit, dans le langage C actuel, vous ne pouvez initialiser que les types entiers avec calloc
(et memset(..., 0, ...)
). L'utiliser pour initialiser autre chose dans le cas général conduit à un comportement indéfini, du point de vue du langage C.
En pratique, calloc
ça marche, comme nous le savons tous :), mais c'est à vous de décider si vous souhaitez l'utiliser (compte tenu de ce qui précède). Personnellement, je préfère l'éviter complètement, utiliser à la malloc
place et effectuer ma propre initialisation.
Enfin, un autre détail important est celui qui calloc
est nécessaire pour calculer la taille finale du bloc en interne , en multipliant la taille des éléments par le nombre d'éléments. Ce faisant, vous calloc
devez surveiller les éventuels débordements arithmétiques. Il en résultera une allocation infructueuse (pointeur nul) si la taille de bloc demandée ne peut pas être calculée correctement. Pendant ce temps, votre malloc
version n'essaie pas de surveiller les débordements. Il allouera une certaine quantité de mémoire "imprévisible" en cas de débordement.
malloc
famille