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 » (allocation de mémoire) et vous permet d'allouer dynamiquement de la mémoire lorsque 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 devez le transtyper vers le type de données approprié.
#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(), et de toujours transtyper le pointeur void retourné pour qu'il corresponde au type de données avec lequel vous travaillez.
Défi
FacileÉcrivez un programme C qui illustre 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 (caster) le pointeur void retourné en un pointeur d'entier
- Lire une valeur entière à partir de l'entrée utilisateur
- Stocker la valeur d'entrée 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.
Aide-mémoire
La fonction malloc() alloue de la mémoire de manière dynamique à partir du tas (heap) pendant l'exécution du programme. Elle prend le nombre d'octets à allouer et renvoie un pointeur void vers le bloc de mémoire alloué, ou NULL si l'allocation échoue.
Incluez <stdlib.h> pour utiliser malloc() :
#include <stdlib.h>
int *ptr = (int*)malloc(sizeof(int)); // Allouer de la mémoire pour un entierPoints clés :
- Toujours transtyper (caster) le pointeur void retourné vers le type de données approprié
- La mémoire reste disponible jusqu'à ce qu'elle soit explicitement libérée
- Offre la flexibilité de demander des quantités exactes de mémoire au moment de l'exécution
- Utilisez
sizeof()pour déterminer le nombre correct d'octets nécessaires
Essayez vous-même
#include <stdio.h>
#include <stdlib.h>
int main() {
// Lire l'entrée
int input_value;
scanf("%d", &input_value);
// À FAIRE : Écrivez votre code ci-dessous
// 1. Utiliser malloc() pour allouer de la mémoire pour un entier
// 2. Convertir le pointeur retourné en int*
// 3. Stocker la valeur d'entrée dans la mémoire allouée
// 4. Afficher la valeur stockée
// 5. Calculer et stocker le carré au même emplacement
// 6. Afficher 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