Il n'y a aucune différence dans la taille du bloc de mémoire alloué. callocremplit 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 callocont 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 charle 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 mallocplace et effectuer ma propre initialisation.
Enfin, un autre détail important est celui qui callocest 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 callocdevez 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 mallocversion n'essaie pas de surveiller les débordements. Il allouera une certaine quantité de mémoire "imprévisible" en cas de débordement.
mallocfamille