Menu
Coddy logo textTech

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.

challenge icon

Défi

Facile

Créez un programme C qui démontre l'allocation dynamique de structures à l'aide de malloc(). Votre programme doit :

  1. Définir une struct nommée Car avec les membres suivants :
    • Un entier year pour stocker l'année de fabrication
    • Un tableau de caractères brand de taille 20 pour stocker la marque de la voiture
    • Un tableau de caractères model de taille 25 pour stocker le modèle de la voiture
    • Un flottant price pour stocker le prix de la voiture
    • Un entier mileage pour stocker le kilométrage de la voiture
  2. Dans la fonction principale, déclarer un pointeur vers une structure Car nommé carPtr
  3. Utiliser malloc() pour allouer dynamiquement de la mémoire pour une structure Car et assigner l'adresse retournée à carPtr
  4. Vérifier si l'allocation de mémoire a réussi :
    • Si carPtr est NULL, afficher Memory allocation failed et quitter le programme
    • Si l'allocation a réussi, afficher Memory allocation successful
  5. 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
  6. 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
  7. 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] years
    • Current Value: [current_value]
  8. Libérer la mémoire allouée dynamiquement en utilisant free(carPtr)
  9. 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;
}
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