Les fonctions malloc() et calloc() sont des fonctions de bibliothèque qui allouent de la mémoire de manière dynamique. Dynamique signifie que la mémoire est allouée pendant l'exécution (exécution du programme) à partir du segment de tas.
Initialisation
malloc() alloue un bloc mémoire d'une taille donnée (en octets) et renvoie un pointeur vers le début du bloc. malloc() n'initialise pas la mémoire allouée. Si vous essayez de lire à partir de la mémoire allouée sans l'initialiser au préalable, vous invoquerez un comportement non défini, ce qui signifie généralement que les valeurs que vous lisez seront des valeurs inutiles.
js chaîne multiligne
calloc() alloue la mémoire et initialise également chaque octet de la mémoire allouée à 0. Si vous essayez de lire la valeur de la mémoire allouée sans l'initialiser, vous obtiendrez 0 car elle a déjà été initialisée à 0 par calloc().
Paramètres
malloc() prend un seul argument, qui est le nombre d'octets à allouer.
Contrairement à malloc(), calloc() prend deux arguments :
- Nombre de blocs à attribuer.
- Taille de chaque bloc en octets.
Valeur de retour
Après une allocation réussie dans malloc() et calloc(), un pointeur vers le bloc de mémoire est renvoyé sinon NULL est renvoyé, ce qui indique un échec.
Exemple
Le code C ci-dessous montre la différence entre les fonctions malloc et calloc pour allouer de la mémoire dynamique.
C
// C code that demonstrates the difference> // between calloc and malloc> #include> #include> int> main()> {> >// Both of these allocate the same number of bytes,> >// which is the amount of bytes that is required to> >// store 5 int values.> >// The memory allocated by calloc will be> >// zero-initialized, but the memory allocated with> >// malloc will be uninitialized so reading it would be> >// undefined behavior.> >int>* allocated_with_malloc =>malloc>(5 *>sizeof>(>int>));> >int>* allocated_with_calloc =>calloc>(5,>sizeof>(>int>));> >// As you can see, all of the values are initialized to> >// zero.> >printf>(>'Values of allocated_with_calloc: '>);> >for> (>size_t> i = 0; i <5; ++i) {> >printf>(>'%d '>, allocated_with_calloc[i]);> >}> >putchar>(>'
'>);> >// This malloc requests 1 terabyte of dynamic memory,> >// which is unavailable in this case, and so the> >// allocation fails and returns NULL.> >int>* failed_malloc =>malloc>(1000000000000);> >if> (failed_malloc == NULL) {> >printf>(>'The allocation failed, the value of '> >'failed_malloc is: %p'>,> >(>void>*)failed_malloc);> >}> >// Remember to always free dynamically allocated memory.> >free>(allocated_with_malloc);> >free>(allocated_with_calloc);> }> |
>
>Sortir
Values of allocated_with_calloc: 0 0 0 0 0 The allocation failed, the value of failed_malloc is: (nil)>
Différence entre malloc() et calloc() en C
Voyons les différences sous forme de tableau :
chaîne sous-chaîne java
| Oui Non. | malloc() | calloc() |
|---|---|---|
| 1. | malloc() est une fonction qui crée un bloc de mémoire d'une taille fixe. | calloc() est une fonction qui attribue un nombre spécifié de blocs de mémoire à une seule variable. |
| 2. | malloc() ne prend qu'un seul argument | calloc() prend deux arguments. |
| 3. | malloc() est plus rapide que calloc. | calloc() est plus lent que malloc() |
| 4. | malloc() a une efficacité temporelle élevée | calloc() a une faible efficacité temporelle |
| 5. | malloc() est utilisé pour indiquer l'allocation de mémoire | calloc() est utilisé pour indiquer une allocation de mémoire contiguë |
| 6. | Syntaxe : void* malloc(size_t size); | Syntaxe : void* calloc(size_t num, size_t size); |
| 8. | malloc() n'initialise pas la mémoire à zéro | calloc() initialise la mémoire à zéro |
| 9. | malloc() n'ajoute aucune surcharge de mémoire supplémentaire | calloc() ajoute une surcharge de mémoire supplémentaire |