Vérifier l'échec de l'allocation
Fait partie de la section Logic & Flow 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é critique que vous devez comprendre : malloc() peut échouer. Lorsque le système manque de mémoire disponible, malloc() ne peut pas satisfaire votre requête et retourne NULL au lieu d'une adresse mémoire valide.
Cela signifie que chaque fois que vous utilisez malloc(), vous devez vérifier s'il a réussi avant de tenter d'utiliser le pointeur retourné. L'utilisation d'un pointeur NULL provoquera 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
}
// Utilisation sûre de 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 de mémoire sont rares sur les systèmes modernes, ils peuvent se produire, en particulier dans des environnements aux ressources limitées ou lors de la demande de grandes quantités de mémoire. Le code C professionnel inclut toujours ces vérifications pour éviter les plantages et assurer une gestion gracieuse des erreurs.
Défi
FacileÉcrivez un programme en 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
nde 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 si l'allocation de mémoire a réussi en testant si le pointeur retourné 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 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 devrait être :
Memory allocation successful!
Sum: 100
Bytes allocated: 16Ce défi souligne l'importance critique de la programmation défensive lors de l'utilisation de l'allocation dynamique de mémoire, garantissant que vos programmes gèrent les échecs potentiels d'allocation de mémoire de manière gracieuse plutôt que de planter de manière inattendue.
Aide-mémoire
Vérifiez toujours si malloc() retourne NULL avant d'utiliser la mémoire allouée :
int *ptr = (int*)malloc(sizeof(int));
if (ptr == NULL) {
printf("Memory allocation failed!\n");
return -1; // Quitter le programme ou gérer l'erreur
}
// Utilisation sûre de ptr ici
*ptr = 42;malloc() peut échouer lorsque le système manque de mémoire disponible. L'utilisation d'un pointeur NULL provoquera une erreur de segmentation. Cette vérification de NULL est essentielle pour écrire des programmes C robustes et prévenir les plantages.
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
// - Utiliser malloc() pour allouer de la mémoire pour n entiers
// - Vérifier si l'allocation a réussi
// - Gérer les cas de succès et d'échec
// - Lire les entiers et les stocker
// - Calculer la somme et les octets alloués
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î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 dynamiques