Menu
Coddy logo textTech

Vérifier l'échec de l'allocation

Fait partie de la section Logique & Flux du Journey C de Coddy. Leçon 34 sur 63.

Bien que malloc() soit un outil puissant pour l’allocation dynamique de mémoire, il y a une réalité cruciale que tu dois comprendre : malloc() peut échouer. Lorsque le système n’a plus de mémoire disponible, malloc() ne peut pas satisfaire ta demande et renvoie NULL au lieu d’une adresse mémoire valide.

Cela signifie qu’à chaque fois que vous utilisez malloc(), vous devez vérifier si l’appel a réussi avant d’essayer d’utiliser le pointeur retourné. L’utilisation d’un pointeur NULL entraînera le plantage de votre programme avec une erreur de segmentation.

int *ptr = (int*)malloc(sizeof(int));

if (ptr == NULL) {
    printf("Memory allocation failed!\n");
    return -1;  // Quitter le programme ou gérer l'erreur
}

// Il est sûr d'utiliser ptr ici
*ptr = 42;

Cette vérification de NULL n’est pas facultative : elle est essentielle pour écrire des programmes C robustes. Même si les échecs d’allocation mémoire sont rares sur les systèmes modernes, ils peuvent survenir, notamment dans des environnements aux ressources limitées ou lors de demandes de grandes quantités de mémoire. Le code C professionnel inclut toujours ces vérifications afin d’éviter les plantages et de permettre une gestion élégante des erreurs.

challenge icon

Défi

Facile

Écrivez un programme C qui démontre une gestion appropriée des erreurs lors de l’utilisation de malloc() pour l’allocation dynamique de mémoire. Votre programme doit :

  1. Lire un entier n auprès de l’utilisateur, représentant le nombre d’entiers à stocker
  2. Utiliser malloc() avec sizeof() pour allouer dynamiquement de la mémoire pour un tableau de n entiers
  3. Vérifier que l’allocation de mémoire a réussi en testant si le pointeur renvoyé est NULL
  4. Si l’allocation échoue, afficher Memory allocation failed! et terminer le programme
  5. Si l’allocation réussit, afficher Memory allocation successful!
  6. Lire n valeurs entières auprès de l’utilisateur et les stocker dans le tableau alloué
  7. Calculer et afficher la somme de toutes les valeurs au format : Sum: [value]
  8. Afficher le nombre total d’octets alloués au format : Bytes allocated: [value]

N’oubliez pas d’inclure l’en-tête <stdlib.h> pour utiliser malloc(). Votre programme doit démontrer la pratique essentielle consistant à vérifier l’échec de l’allocation avant de tenter d’utiliser la mémoire allouée.

Par exemple, si l’entrée est :

4
10 20 30 40

Votre sortie doit être :

Memory allocation successful!
Sum: 100
Bytes allocated: 16

Ce défi met l’accent sur l’importance cruciale de la programmation défensive lors de l’utilisation de l’allocation dynamique de mémoire, afin de garantir que vos programmes gèrent correctement les éventuels échecs d’allocation de mémoire au lieu de se terminer de manière inattendue.

Essayez vous-même

#include <stdio.h>
#include <stdlib.h>

int main() {
    // Lire le nombre d'entiers
    int n;
    scanf("%d", &n);
    
    // TODO: Écrivez votre code ici
    // - Utilisez malloc() pour allouer de la mémoire pour n entiers
    // - Vérifiez si l'allocation a réussi
    // - Gérez les cas de succès et d'échec
    // - Lisez les entiers et stockez-les
    // - Calculate the sum and bytes allocated
    
    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 Logique & Flux

Entraînez-vous par vous-même : Compilateur C en ligne