Menu
Coddy logo textTech

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.

challenge icon

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 :

  1. Lire un entier size de l'utilisateur représentant le nombre d'entiers à allouer
  2. Utiliser calloc() pour allouer dynamiquement de la mémoire pour un tableau de size entiers
  3. Vérifier si l'allocation de mémoire a réussi - si elle échoue, afficher Memory allocation failed! et terminer le programme
  4. Si l'allocation réussit, afficher Memory allocated and initialized to zero!
  5. Afficher toutes les valeurs initiales du tableau pour démontrer qu'elles sont à zéro, au format : Initial values: [value1] [value2] [value3] ...
  6. Lire size valeurs entières de l'utilisateur et les stocker dans le tableau alloué
  7. Afficher toutes les valeurs mises à jour au format : Updated values: [value1] [value2] [value3] ...
  8. Calculer et afficher la somme de toutes les valeurs au format : Sum: [value]
  9. Utiliser free() pour libérer la mémoire
  10. 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 30

Votre 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 à 0

Comme 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;
}
quiz iconTestez-vous

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