Allocation dynamique - malloc()
Fait partie de la section Logic & Flow du Journey C de Coddy — leçon 32 sur 63.
Maintenant, vous allez découvrir malloc(), la fonction principale pour demander de la mémoire au tas (heap) pendant l'exécution du programme. La fonction malloc() signifie « memory allocation » et vous permet d'allouer dynamiquement de la mémoire quand vous en avez besoin, plutôt que de déclarer des variables de taille fixe au moment de la compilation.
La fonction malloc() prend un argument : le nombre d'octets que vous souhaitez allouer. Elle retourne un pointeur void vers le bloc de mémoire alloué, ou NULL si l'allocation échoue. Puisqu'elle retourne un pointeur void, vous pouvez l'assigner directement à un pointeur typé ; le transtypage (casting) est optionnel en C (contrairement au C++, qui l'exige).
#include <stdlib.h>
int *ptr = (int*)malloc(sizeof(int)); // Allouer de la mémoire pour un entier
// ptr pointe maintenant vers un emplacement mémoire pouvant contenir un entierL'avantage principal de
malloc()est la flexibilité - vous pouvez demander exactement la quantité de mémoire dont vous avez besoin au moment de l'exécution, et cette mémoire reste disponible jusqu'à ce que vous la libériez explicitement. C'est particulièrement utile lorsque vous ne savez pas de quelle quantité de mémoire vous aurez besoin avant que votre programme ne soit en cours d'exécution.
N'oubliez pas d'inclure <stdlib.h> pour utiliser malloc(), le transtypage du pointeur void retourné est optionnel en C, car il est automatiquement converti vers le type auquel vous l'assignez.
Défi
FacileÉcrivez un programme C qui démontre l'allocation dynamique de mémoire en utilisant malloc() pour créer et manipuler un seul entier sur le tas (heap). Votre programme doit :
- Utiliser
malloc()pour allouer dynamiquement de la mémoire pour un entier - Convertir (cast) le pointeur void retourné en un pointeur d'entier
- Lire une valeur entière à partir de l'entrée utilisateur
- Stocker la valeur saisie dans la mémoire allouée dynamiquement en utilisant l'opérateur de déréférencement
- Afficher la valeur stockée au format :
Stored value: [value] - Calculer et stocker le carré de la valeur au même emplacement mémoire
- Afficher la valeur au carré au format :
Squared value: [value]
N'oubliez pas d'inclure l'en-tête <stdlib.h> pour utiliser malloc(). Votre programme doit démontrer le flux de travail de base de l'allocation dynamique de mémoire : demander de la mémoire au tas, l'utiliser pour stocker et manipuler des données, et travailler avec la mémoire allouée via des opérations sur les pointeurs.
Par exemple, si l'utilisateur saisit 7, votre sortie devrait être :
Stored value: 7
Squared value: 49Ce défi vous présente le concept fondamental de l'allocation dynamique de mémoire, où la mémoire est demandée au moment de l'exécution plutôt que d'être fixée au moment de la compilation, offrant ainsi à vos programmes une plus grande flexibilité dans l'utilisation de la mémoire.
Essayez vous-même
#include <stdio.h>
#include <stdlib.h>
int main() {
// Lire l'entrée
int input_value;
scanf("%d", &input_value);
// TODO: Écrivez votre code ci-dessous
// 1. Utilisez malloc() pour allouer de la mémoire pour un entier
// 2. Castez le pointeur retourné en int*
// 3. Stockez la valeur d'entrée dans la mémoire allouée
// 4. Affichez la valeur stockée
// 5. Calculez et stockez le carré au même emplacement
// 6. Affichez la valeur au carré
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