calloc vs. Malloc

calloc vs. Malloc

Quand calloc est utilisé pour allouer un bloc de mémoire, la région allouée est initialisée aux zéros. En revanche, Malloc ne touche pas le contenu du bloc de mémoire alloué, ce qui signifie qu'il contient des valeurs de déchets. Cela pourrait potentiellement représenter un risque de sécurité car le contenu de la mémoire est imprévisible et les erreurs de programmation peuvent entraîner une fuite de ce contenu.

Tableau de comparaison

Différences - similitudes - Calloc contre Malloc Tableau de comparaison
callocMalloc
Fonction alloue une région de mémoire suffisamment grande pour contenir des "éléments" de "taille" octets chacun. Initialise également le contenu de la mémoire aux zéros. alloue des octets de mémoire "taille".
Nombre d'arguments 2 1
Syntaxe void * calloc (numéro_of_blocks, size_of_each_block_in_bytes); void * malloc (size_in_bytes);
Contenu de la mémoire allouée La région allouée est initialisée à zéro. Le contenu de la mémoire allouée n'est pas modifié. je.e., La mémoire contient des valeurs imprévisibles ou des ordures. Cela présente un risque.
Valeur de retour pointeur void (void *). Si l'allocation réussit, un pointeur vers le bloc de mémoire est renvoyé. Si l'allocation de la mémoire échoue, un pointeur nul est renvoyé. pointeur void (void *). Si l'allocation réussit, un pointeur vers le bloc de mémoire est renvoyé. Si l'allocation de la mémoire échoue, un pointeur nul est renvoyé.

Syntaxe et exemples

malloc ()

void * malloc (size_t size); 

alloue taille octets de mémoire. Si l'allocation réussit, un pointeur vers la mémoire allouée est renvoyé. Sinon NUL est retourné. Exemple:

/ * Allouer de la mémoire à un tableau avec 15 éléments de type int. * / int * ptr = malloc (15 * sizeof (int)); if (ptr == null) / * la mémoire ne peut pas être allouée, alors imprimez une erreur et sortez. * / fprintf (stderr, "ne pouvait pas allouer la mémoire \ n"); exit (exit_failure);  / * L'allocation a réussi. * / 

Noter que Malloc exige que nous calculons les octets de mémoire dont nous avons besoin et que nous le transmets comme argument à Malloc.

calloc ()

void * calloc (size_t nelements, size_t octets); 

alloue un bloc de mémoire contigu suffisamment grand pour tenir nevant de taille octets chaque. La région allouée est initialisée à zéro. Dans l'exemple ci-dessus:

/ * Allouer de l'espace pour un tableau avec 15 éléments de type int et initialiser aux zéros. * / int * ptr = calloc (15, sizeof (int)); if (ptr == null) / * la mémoire ne peut pas être allouée, alors imprimez une erreur et sortez. * / fprintf (stderr, "ne pouvait pas allouer la mémoire \ n"); exit (exit_failure);  / * L'allocation a réussi. * / 

calloc (m, n) est le même que

p = malloc (m * n); if (p) memset (p, 0, m * n); 

Vidéo expliquant Calloc, Malloc et Realloc

Ce didacticiel vidéo explique les fonctions d'allocation de mémoire Malloc, calloc et realloc, ainsi que la fonction de désallocation de mémoire gratuit:

Considérations de sécurité

C'est généralement une bonne idée d'utiliser calloc sur Malloc. Lorsque vous utilisez Malloc, le contenu de la mémoire allouée est imprévisible. Les erreurs de programmation peuvent entraîner la fuite de ces contenus de mémoire de manière involontaire mais très vulnérable. Un bon exemple d'une telle fuite est la vulnérabilité Heartbleed dans OpenSSL, dont le mécanisme de base est expliqué dans cette bande dessinée XKCD et certains détails techniques sont dans cet article de blog.

Vitesse d'exécution

Calloc est un peu plus lent que Malloc en raison de l'étape supplémentaire de l'initialisation de la région de mémoire allouée. Cependant, en pratique, la différence de vitesse est très petite et peut être ignorée.