CALLOC |
Allocation Combiné |
---|---|
Langage C++ | cstdlib (stdlib.h) |
Syntaxe
void *calloc(size_t n,size_t taille); |
Paramètres
Nom | Description |
---|---|
n | Ce paramètre permet d'indiquer le nombre de bloc de mémoire à allouer |
taille | Ce paramètre permet d'indiquer la taille du bloc de mémoire à allouer |
Description
Cette fonction permet d'effectuer une réservation de n*taille d'octets de mémoire dynamique.
Remarques
- La fonction calloc() alloue de la mémoire dont la taille est égale à n*taille. Autrement dit, la fonction calloc() alloue suffisamment de mémoire pour un tableau d'objets n de la taille du paramètre taille.
- La fonction calloc() renvoie un pointeur sur le premier octet de la région allouée. S'il n'y a pas assez de mémoire pour satisfaire la demande, un pointeur null est renvoyé. Il est toujours important de vérifier que la valeur de retour n'est pas null avant de tenter de l'utiliser.
- Définition et utilité : La fonction calloc (pour contiguous allocation) est utilisée pour allouer dynamiquement de la mémoire pour un tableau d'éléments et initialise chaque octet de la mémoire allouée à zéro. Elle est définie dans l'entête <cstdlib> en C++ et est principalement utilisée pour la gestion de la mémoire dynamique lorsqu'on a besoin d'un tableau ou d'un bloc de mémoire initialisé à zéro.
- Initialisation à zéro : Contrairement à malloc, allouant de la mémoire sans initialiser son contenu, calloc initialise chaque octet de la mémoire allouée à zéro. Cela peut être utile pour éviter des comportements indéfinis dus à l'utilisation de mémoire non initialisée, ce qui est fréquent dans les applications critiques.
- Retour d'un pointeur void* : La fonction calloc retourne un pointeur générique (void*), ce qui signifie que vous devez le convertir vers un type spécifique pour l'utiliser. Par exemple, si vous allouez un tableau d'entiers, vous devrez caster le pointeur renvoyé par calloc comme suit :
- Gestion des erreurs d'allocation : Si la mémoire ne peut pas être allouée (par exemple, si la taille demandée dépasse la mémoire disponible), calloc
renvoie un pointeur nul (nullptr). Il est donc essentiel de vérifier ce pointeur avant de l'utiliser pour éviter des erreurs d'exécution. Par exemple :
- if (arr == nullptr) {
- std::cerr << "Erreur d'allocation mémoire." << std::endl;
- }
- Différence avec malloc : La principale différence entre calloc et malloc réside dans l'initialisation de la mémoire. Tandis que malloc alloue de la mémoire sans l'initialiser, calloc initialise la mémoire allouée à zéro. Si vous avez besoin de mémoire initialisée à zéro, calloc est préférable, mais si l'initialisation n'est pas nécessaire ou si vous souhaitez initialiser les valeurs différemment, malloc peut être plus rapide, car il ne fait pas l'initialisation.
- Utilisation dans les tableaux dynamiques : calloc est souvent utilisée pour allouer des tableaux dynamiques de manière sécurisée, car elle garantit que tous les éléments du tableau sont initialisés à zéro. Cela peut être important dans des programmes où vous devez vous assurer que les variables du tableau ne contiennent pas de valeurs indéfinies ou anciennes.
- Limitations et alternatives en C++ : Bien que calloc soit utile pour l'allocation dynamique de mémoire, il n'est pas très utilisé en C++ moderne, où les mécanismes d'allocation et de gestion de la mémoire sont généralement plus sûrs et plus flexibles grâce à la bibliothèque standard C++ et à l'utilisation de classes comme std::vector. Ces classes gèrent automatiquement la mémoire et permettent d'éviter des erreurs courantes, comme des fuites de mémoire, sans nécessiter de gestion explicite de l'allocation ou de l'initialisation.
Exemple
Voici quelques exemples typiques de l'utilisation de cette fonction :

- #include <iostream>
- #include <cstdlib>
-
- int main()
- {
- int * p = (int *)calloc(20,sizeof(int));
- if(NULL != p) {
- int I;
- for(I = 0; I < 20; I++) {
- p[I] = 1000-(I * 10);
- }
- std::cout << "Valeur p[15] = " << p[15] << std::endl;
- free(p);
- } else {
- std::cout << "Impossible d'allouer de la mémoire dynamiquement !" << std::endl;
- }
- return 0;
- }
on obtiendra le résultat suivant :
Valeur p[15] = 850Voir également
Langage de programmation - C++ - Référence de procédures et fonctions - realloc
Langage de programmation - C++ - Référence de procédures et fonctions - malloc
Langage de programmation - C++ - Référence de procédures et fonctions - free
Langage de programmation - C - Référence de procédures et fonctions - calloc
Références
Langage C, Edition Micro-Application, Gehard Willms, 2001, ISBN: 2-7429-2008-0, page 730.
Borland C++ for Windows 4.0, Library Reference, Edition Borland, 1993, Part # BCP1240WW21772, page 46.
Dernière mise à jour : Lundi, le 3 août 2015