Allouer avec calloc()
Fait partie de la section Logic & Flow du Journey C de Coddy — leçon 36 sur 63.
Alors que malloc() est la fonction la plus courante pour l'allocation dynamique de mémoire, le C propose une autre alternative utile : calloc(). La fonction calloc(), qui signifie « contiguous allocation » (allocation contiguë), offre un moyen pratique d'allouer de la mémoire pour des tableaux avec un avantage supplémentaire important.
Contrairement à malloc() qui prend un seul argument (le nombre total d'octets), calloc() prend deux arguments : le nombre d'éléments que vous souhaitez allouer et la taille de chaque élément. Cela le rend particulièrement intuitif lors de la manipulation de tableaux. Par exemple :
#include <stdlib.h>
// Allouer de l'espace pour 5 entiers en utilisant calloc()
int *arr = (int*)calloc(5, sizeof(int));
// Ceci est équivalent à : malloc(5 * sizeof(int))L'avantage principal de calloc() est qu'il initialise automatiquement toute la mémoire allouée à zéro. Lorsque vous utilisez malloc(), la mémoire allouée contient les valeurs aléatoires qui y étaient précédemment stockées, mais calloc() garantit que chaque octet est mis à zéro. Cela signifie que tous les entiers seront à 0, tous les flottants à 0.0 et tous les pointeurs seront NULL.
Comme malloc(), calloc() retourne un pointeur vers la mémoire allouée ou NULL si l'allocation échoue, vous devez donc toujours vérifier si l'allocation a échoué et ne pas oublier de libérer la mémoire avec free() lorsque vous avez fini de l'utiliser.
Défi
FacileÉcrivez un programme en C qui démontre l'utilisation de calloc() pour l'allocation dynamique de mémoire avec une initialisation automatique à zéro. Votre programme doit :
- Lire un entier
sizede l'utilisateur représentant le nombre d'entiers à allouer - Utiliser
calloc()pour allouer dynamiquement de la mémoire pour un tableau desizeentiers - Vérifier si l'allocation de mémoire a réussi - si elle échoue, afficher
Memory allocation failed!et terminer le programme - Si l'allocation réussit, afficher
Memory allocated and initialized to zero! - Afficher toutes les valeurs initiales du tableau pour démontrer qu'elles sont à zéro, au format :
Initial values: [value1] [value2] [value3] ... - Lire
sizevaleurs entières de l'utilisateur et les stocker dans le tableau alloué - Afficher toutes les valeurs mises à jour au format :
Updated values: [value1] [value2] [value3] ... - Calculer et afficher la somme de toutes les valeurs au format :
Sum: [value] - Utiliser
free()pour libérer la mémoire - Afficher
Memory freed!pour confirmer le nettoyage
N'oubliez pas d'inclure l'en-tête <stdlib.h> pour utiliser calloc() et free(). Ce défi démontre l'avantage clé de calloc() par rapport à malloc() : l'initialisation automatique de toute la mémoire allouée à zéro.
Par exemple, si l'entrée est :
3
10 20 30Votre sortie devrait être :
Memory allocated and initialized to zero!
Initial values: 0 0 0
Updated values: 10 20 30
Sum: 60
Memory freed!Ce défi met en évidence comment calloc() fournit un état de départ propre et prévisible pour vos tableaux alloués dynamiquement, éliminant les valeurs résiduelles imprévisibles que malloc() pourrait laisser derrière lui.
Aide-mémoire
La fonction calloc() fournit une allocation de mémoire dynamique avec une initialisation automatique à zéro.
Syntaxe :
void* calloc(size_t num_elements, size_t element_size);Différences clés par rapport à malloc() :
- Prend deux arguments : le nombre d'éléments et la taille de chaque élément
- Initialise automatiquement toute la mémoire allouée à zéro
- Plus intuitif pour l'allocation de tableaux
Exemple d'utilisation :
#include <stdlib.h>
// Allouer de l'espace pour 5 entiers en utilisant calloc()
int *arr = (int*)calloc(5, sizeof(int));
// Ceci est équivalent à : malloc(5 * sizeof(int))
// Mais toutes les valeurs sont garanties d'être à 0Comme malloc(), calloc() retourne un pointeur vers la mémoire allouée ou NULL si l'allocation échoue. Vérifiez toujours l'échec de l'allocation et utilisez free() pour libérer la mémoire une fois terminé.
Essayez vous-même
#include <stdio.h>
#include <stdlib.h>
int main() {
int size;
// Lire la taille du tableau
scanf("%d", &size);
// À FAIRE : Écrivez votre code ci-dessous
// Utiliser calloc() pour allouer de la mémoire pour le tableau
// Vérifier si l'allocation a réussi
// Afficher les valeurs initiales (devraient être zéro)
// Lire et stocker les valeurs d'entrée
// Afficher les valeurs mises à jour
// Calculer et afficher la somme
// Libérer la mémoire allouée
return 0;
}Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Logic & Flow
1Les bases des pointeurs
Qu'est-ce qu'un pointeur ?Déclaration de pointeursL'opérateur d'adresse (&)L'opérateur de déréférencement (*)Pointeurs NULLRécapitulatif : Les bases des pointeurs4Projet : Utilitaire de texte simple
Présentation du projetCompter les caractères2Pointeurs et Tableaux
Noms de tableaux comme pointeursÉléments de tableau - PointeursArithmétique des pointeursComparaison de pointeursRécapitulatif : Parcours de tableau par pointeur5Pointeurs et fonctions
Passage par valeurPassage de pointeurs aux fonctionsModifier des variables via des pointeursUn exemple classique : SwapPassage de tableaux aux fonctionsRécapitulatif : Pointeurs comme arguments de fonction3Tableaux de caractères et chaînes
Les chaînes comme tableaux de charLe terminateur nulSaisie de chaînes avec scanfUtilisation de strlen()Utilisation de strcpy()Utilisation de strcat()Utilisation de strcmp()Récapitulatif : Fonctions de base sur les chaînes