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.
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 :
- Lire un entier
nauprès de l’utilisateur, représentant le nombre d’entiers à stocker - Utiliser
malloc()avecsizeof()pour allouer dynamiquement de la mémoire pour un tableau denentiers - Vérifier que l’allocation de mémoire a réussi en testant si le pointeur renvoyé est
NULL - Si l’allocation échoue, afficher
Memory allocation failed!et terminer le programme - Si l’allocation réussit, afficher
Memory allocation successful! - Lire
nvaleurs entières auprès de l’utilisateur et les stocker dans le tableau alloué - Calculer et afficher la somme de toutes les valeurs au format :
Sum: [value] - 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 40Votre sortie doit être :
Memory allocation successful!
Sum: 100
Bytes allocated: 16Ce 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;
}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
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înes6Gestion de la mémoire
Mémoire Pile vs TasAllocation dynamique - malloc()Utiliser sizeof() pour l'allocationVérifier l'échec de l'allocationLibérer la mémoire avec free()Allouer avec calloc()Récapitulatif : Tableaux dynamiquesEntraînez-vous par vous-même : Compilateur C en ligne