calloc vs. Malloc
- 3103
- 218
- M Lilou Philippe
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 | Malloc | |
---|---|---|
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.