calloc vs malloc

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..

Tableau de comparaison

tableau de comparaison calloc vs malloc
callocmalloc
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é..

Contenu: calloc vs malloc

  • 1 Syntaxe et exemples
    • 1,1 malloc ()
    • 1.2 calloc ()
  • 2 Vidéo expliquant Calloc, Malloc et Realloc
  • 3 considérations de sécurité
  • 4 vitesse d'exécution
  • 5 références

Syntaxe et exemples

malloc ()

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.

calloc ()

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); 

Vidéo expliquant Calloc, Malloc et Realloc

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:

Considérations de sécurité

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..

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 mémoire allouée. Cependant, dans la pratique, la différence de vitesse est très petite et peut être ignorée.

Références

  • calloc page de manuel
  • malloc page de manuel