calloc contre malloc

Lorsque calloc est utilisé pour allouer un bloc de mémoire, la région allouée est initialisée à zéro. En revanche, malloc ne touche pas le contenu du bloc de mémoire alloué, ce qui signifie qu'il contient des valeurs inutiles. Cela pourrait potentiellement être un risque pour la sécurité car le contenu de la mémoire est imprévisible et des erreurs de programmation peuvent entraîner une fuite de ce contenu.

Tableau de comparaison

tableau de comparaison calloc versus malloc
calloc malloc
Une fonctionalloue une région de mémoire suffisamment grande pour contenir "n éléments" de "taille" octets chacun. Initialise également le contenu de la mémoire à zéro.alloue "taille" octets de mémoire.
Nombre d'arguments21
Syntaxevoid * calloc (number_of_blocks, size_of_each_block_in_bytes);void * malloc (size_in_bytes);
Contenu de la mémoire allouéeLa région allouée est initialisée à zéro.Le contenu de la mémoire allouée n'est pas modifié. c'est-à-dire que la mémoire contient des valeurs imprévisibles ou inutiles. Cela présente un risque.
Valeur de retourpointeur vide (void *). Si l'allocation réussit, un pointeur vers le bloc de mémoire est renvoyé. Si l'allocation de mémoire échoue, un pointeur NULL est renvoyé.pointeur vide (void *). Si l'allocation réussit, un pointeur vers le bloc de mémoire est renvoyé. Si l'allocation de mémoire échoue, un pointeur NULL est renvoyé.

Syntaxe et exemples

malloc ()

 void * malloc (size_t size); 

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

 / * Alloue de la mémoire pour un tableau avec 15 éléments de type int . * / int * ptr = malloc (15 * sizeof (int)); if (ptr == NULL) {/ * La mémoire n'a pas pu être allouée, donc affichez une erreur et quittez. * / fprintf (stderr, "Impossible d’allouer de la mémoire \ n"); exit (EXIT_FAILURE); } / * L'allocation a réussi. * / 

Notez que malloc nécessite que nous calculions les octets de mémoire dont nous avons besoin et que nous passions cela en argument à malloc.

calloc ()

 void * calloc (size_t nelements, size_t octets); 

alloue un bloc de mémoire contigu suffisamment grand pour contenir nelements des nelements de taille bytes . La région allouée est initialisée à zéro. Dans l'exemple ci-dessus:

 / * Alloue de l'espace pour un tableau avec 15 éléments de type int et initialise à zéro. * / int * ptr = calloc (15, sizeof (int)); if (ptr == NULL) {/ * La mémoire n'a pas pu être allouée, donc affichez une erreur et quittez. * / fprintf (stderr, "Impossible d’allouer de 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 calloc mémoire free :

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. Des erreurs de programmation peuvent provoquer une 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 quelques détails plus techniques sont dans ce billet de blog.

Rapidité d'exécution

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

Articles Connexes