Allocation dynamique de structures
Fait partie de la section Logic & Flow du Journey C de Coddy — leçon 48 sur 63.
Jusqu'à présent, vous avez appris à créer des structs sur la pile - elles existent dans la portée où elles sont déclarées et sont automatiquement nettoyées lorsque cette portée se termine. Mais que se passe-t-il si vous avez besoin qu'une struct persiste au-delà de sa portée d'origine, ou lorsque vous ne savez pas au moment de la compilation de combien de structs vous aurez besoin ?
C'est ici que l'allocation dynamique intervient. Vous pouvez utiliser malloc() pour créer des structures sur le tas, tout comme vous le feriez pour n'importe quel autre type de données. La différence clé est que les structures allouées dynamiquement restent en mémoire jusqu'à ce que vous les libériez explicitement avec free().
Voici la syntaxe pour allouer dynamiquement une structure :
struct Point *ptr = malloc(sizeof(struct Point));Cela alloue suffisamment de mémoire sur le tas pour contenir une structure Point et retourne un pointeur vers cette mémoire. Vous pouvez ensuite utiliser l'opérateur flèche pour accéder aux membres de la structure et les modifier :
ptr->x = 10;
ptr->y = 20;N'oubliez pas de toujours vérifier si malloc() a réussi (a retourné une valeur non-NULL) et d'appeler free(ptr) lorsque vous avez terminé avec la structure pour éviter les fuites de mémoire. Cette technique est essentielle pour construire des programmes flexibles qui peuvent créer et gérer des structures de données au moment de l'exécution.
Défi
FacileCréez un programme C qui démontre l'allocation dynamique de structures à l'aide de malloc(). Votre programme doit :
- Définir une
structnomméeCaravec les membres suivants :- Un entier
yearpour stocker l'année de fabrication - Un tableau de caractères
brandde taille 20 pour stocker la marque de la voiture - Un tableau de caractères
modelde taille 25 pour stocker le modèle de la voiture - Un flottant
pricepour stocker le prix de la voiture - Un entier
mileagepour stocker le kilométrage de la voiture
- Un entier
- Dans la fonction principale, déclarer un pointeur vers une structure
CarnommécarPtr - Utiliser
malloc()pour allouer dynamiquement de la mémoire pour une structureCaret assigner l'adresse retournée àcarPtr - Vérifier si l'allocation de mémoire a réussi :
- Si
carPtrestNULL, afficherMemory allocation failedet quitter le programme - Si l'allocation a réussi, afficher
Memory allocation successful
- Si
- Lire les valeurs d'entrée suivantes et les assigner aux membres de la structure en utilisant l'opérateur flèche :
- Lire un entier pour l'année et l'assigner en utilisant
carPtr->year - Lire une chaîne de caractères pour la marque et l'assigner en utilisant
carPtr->brand - Lire une chaîne de caractères pour le modèle et l'assigner en utilisant
carPtr->model - Lire un flottant pour le prix et l'assigner en utilisant
carPtr->price - Lire un entier pour le kilométrage et l'assigner en utilisant
carPtr->mileage
- Lire un entier pour l'année et l'assigner en utilisant
- Après avoir lu toutes les valeurs, effectuer les calculs suivants en utilisant l'opérateur flèche :
- Calculer l'âge de la voiture en soustrayant l'année de 2024 :
int age = 2024 - carPtr->year; - Calculer le taux de dépréciation en fonction de l'âge : si l'âge est supérieur à 10, fixer la dépréciation à 0.6, sinon la fixer à 0.8
- Calculer la valeur actuelle :
carPtr->price * depreciation
- Calculer l'âge de la voiture en soustrayant l'année de 2024 :
- Afficher les informations de la voiture en utilisant l'opérateur flèche dans ce format exact :
Car Information:Year: [year]Brand: [brand]Model: [model]Original Price: [price]Mileage: [mileage]Age: [age] yearsCurrent Value: [current_value]
- Libérer la mémoire allouée dynamiquement en utilisant
free(carPtr) - Afficher
Memory freed successfully
Ce défi teste votre compréhension de l'allocation dynamique de structures à l'aide de malloc(), de la vérification de l'échec de l'allocation, de l'accès aux membres d'une structure via des pointeurs à l'aide de l'opérateur flèche, et de la libération correcte de la mémoire allouée avec free(). Vous pratiquerez le cycle de vie complet de la gestion dynamique de la mémoire avec des structures.
Aide-mémoire
Utilisez malloc() pour allouer dynamiquement des structures sur le tas (heap) :
struct Point *ptr = malloc(sizeof(struct Point));Accédez aux membres de la structure via des pointeurs en utilisant l'opérateur flèche :
ptr->x = 10;
ptr->y = 20;Vérifiez toujours si malloc() a réussi et libérez la mémoire une fois terminé :
if (ptr == NULL) {
// Gérer l'échec de l'allocation
}
// Utiliser la structure...
free(ptr);Essayez vous-même
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// TODO : Définir la structure Car ici
int main() {
// TODO : Déclarer un pointeur vers la structure Car nommé carPtr
// TODO : Utiliser malloc() pour allouer de la mémoire pour une structure Car
// TODO : Vérifier si l'allocation de mémoire a réussi
// Lire les valeurs d'entrée
int year, mileage;
char brand[20], model[25];
float price;
scanf("%d", &year);
scanf("%s", brand);
scanf("%s", model);
scanf("%f", &price);
scanf("%d", &mileage);
// TODO : Assigner les valeurs d'entrée aux membres de la structure en utilisant l'opérateur flèche
// TODO : Calculer l'âge, la dépréciation et la valeur actuelle
// TODO : Afficher les informations de la voiture dans le format requis
// TODO : Libérer la mémoire allouée et afficher un message de succè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 fonction8Structures et Pointeurs
Pointeurs vers des structuresL'opérateur flèche (->)Passage de structures par valeurPassage de pointeurs de structuresAllocation dynamique de structuresRécap : Modifier une structure - Ptr3Tableaux 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