Quand 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 parasites. Cela pourrait constituer 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..
calloc | malloc | |
---|---|---|
Une fonction | alloue une région de mémoire suffisamment grande pour contenir "n éléments" d'octets "taille" chacun. Initialise également le contenu de la mémoire à zéro. | alloue des octets de "taille" de mémoire. |
Nombre d'arguments | 2 | 1 |
Syntaxe | void * calloc (number_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é. c'est-à-dire que la mémoire contient des valeurs imprévisibles ou erronées. Cela présente un risque. |
Valeur de retour | pointeur vide (void *). Si l'allocation réussit, un pointeur sur 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 sur le bloc de mémoire est renvoyé. Si l'allocation de mémoire échoue, un pointeur NULL est renvoyé.. |
void * malloc (size_t size);
alloue Taille
octets de mémoire. Si l'allocation réussit, un pointeur sur la mémoire allouée est renvoyé. Autrement NUL
est retourné. Exemple:
/ * Alloue de la mémoire pour un tableau de 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); / * Allocation réussie. * /
Notez que malloc
exige que nous calculions les octets de mémoire dont nous avons besoin et que nous transmettions cela comme argument à malloc.
void * calloc (size_t nelements, size_t octets);
alloue un bloc de mémoire contigu suffisamment grand pour contenir éléments
de taille octets
chaque. La région allouée est initialisée à zéro. Dans l'exemple ci-dessus:
/ * Alloue de l'espace pour un tableau de 15 éléments de type int et initialiser à 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); / * Allocation réussie. * /
calloc (m, n) est identique à
p = malloc (m * n); si (p) memset (p, 0, m * n);
Ce tutoriel vidéo explique les fonctions d’allocation de mémoire malloc
, calloc
et realloc
, ainsi que la fonction de désallocation de la mémoire libre
:
C'est généralement une bonne idée d'utiliser calloc
plus de malloc
. Lorsque vous utilisez malloc, le contenu de la mémoire allouée est imprévisible. Des erreurs de programmation peuvent entraîner une fuite de contenu de la mémoire de manière non intentionnelle mais très vulnérable. Un bon exemple d’une telle fuite est la vulnérabilité de Heartbleed dans OpenSSL, dont le mécanisme de base est expliqué dans cette bande dessinée XKCD. Certains détails plus techniques figurent dans cet article de blog..
calloc est un peu plus lent que malloc en raison de l'étape supplémentaire d'initialisation de la région mémoire allouée. Cependant, dans la pratique, la différence de vitesse est très petite et peut être ignorée.