3. Objectifs du chapitre
3
Dr. Fadoua.BOUAFIF
A la fin du chapitre, les étudiants seront en mesure de:
- Définir une variable dynamique en algorithmique et en langage C
- Déterminer la nécessité d’une variable dynamique pour la résolution d’un
problème
- Nommer l’action de l’allocation mémoire d’une variable dynamique à fin
d’écrire un programme exécutable
4. plan du chapitre
1) Introduction
2) Variables Statiques et Variables Dynamiques
3) Allocation dynamique de la mémoire
4) Exercice d’application
5) Conclusion
4
Dr. Fadoua.BOUAFIF
5. Introduction
Un programme renferme des données et des traitements.
Les traitements sont représentés par des instructions et les données sont représentées par des
variables.
Ces variables peuvent être de types simple ou complexe.
Il existe deux façons d'allouer de l’espace pour ces variables :
Allocation statique variables statiques
Allocation dynamique variables dynamiques
5
Dr. Fadoua.BOUAFIF
6. Variables Statiques & Variables Dynamiques
Les variables statiques sont caractérisées par :
leurs formes et tailles qui sont déclarées à l'avance dans le programme.
leurs existences en mémoire durant toute l'exécution du sous-programme dans
lequel elles sont définies.
leurs référencements directs par leurs noms de variables.
Exemple : T : Tableau [0..9] d'entiers // int T[10];
6
1. Variables statiques
Dr. Fadoua.BOUAFIF
7. Variables Statiques & Variables Dynamiques (suite)
L'utilisation d'un énorme flux d'information résulte dans la réservation d'un espace mémoire pour
ces informations, qui ne sera libéré qu'à la fin de l'exécution.
Si une partie de cet espace est uniquement utilisée, alors il y aura un espace superflu et
inutilisable mais qui est aussi réservé perte de l’espace mémoire
Si l’espace prédéfinit doit être modifié pour le besoin de fonctionnement du programme
(augmenter la taille d'un tableau par exemple), alors il y aura un problème d'allocation et
aucune modification n'est permise durant l'exécution du programme blocage
Donc , l'utilisation des variables dynamiques est la solution à ces problèmes.
7
Dr. Fadoua.BOUAFIF
8. Variables Statiques & Variables Dynamiques (suite)
Une variable dynamique peut être crée ou supprimée au fur et à mesure des besoins.
Une variable dynamique est référencée par un Pointeur qui contient l'adresse de la
variable dynamique, appelée encore variable pointée.
8
x
Variable dynamique
Variable pointée
pt
Pointeur
L’adresse de x Exemple:
int x;
int *pt;
pt = &x;
2. Variables dynamiques
Remarque: Lorsque le pointeur ne reçoit aucune adresse, il se pointe sur nulle.
Si vous déclarez un pointeur sans l’initialiser, alors lorsque vous tentez de l’utiliser, le
programme se plante. Pour éviter cela, le pointeur doit être initialisé à NIL (en C, NULL)
9. Allocation Dynamique de la mémoire:
présentation
9
Lorsqu'une variable est définit, un emplacement mémoire est crée et est réservé pour y stocker
sa valeur correspondante, et ce pour n'importe quel type de variable.
L'allocation dynamique permet une réservation dynamique d'un emplacement mémoire en
cours d'exécution d'un programme et la durée de vie de cet emplacement dépend de son utili-
sation.
permet un gain en espace mémoire et offre une solution pour les problèmes de réservation
dont la taille est fixée à l'avance, comme pour les tableaux (en général).
permet de réserver un espace mémoire au moment où le programme a besoin.
Une variable dynamique peut être libérer (récupérer l’espace occupé par celle-ci et l'utiliser pour
d'autres), si elle n’est plus nécessaire dans un programme. La valeur de la variable n’est pas
supprimée de la mémoire, elle sera écrasée lors d'une nouvelle allocation, puisque l'espace
mémoire est libéré.
Dr. Fadoua.BOUAFIF
10. Allocation Dynamique de la mémoire
Syntaxe En algorithme
10
La fonction allouer() permet de réserver dynamiquement un emplacement d'un objet de type
définit et d'attribuer son adresse à une variable de type pointeur.
Avec cette fonction, le système essaye d'allouer une place mémoire inoccupée et ce à partir de
la liste des emplacements libres.
allouer ( nompointeur)
La fonction libérer() permet de récupérer l’espace occupé par la variable dynamique. L'opération
s’appelle désallocation.
libérer (nompointeur )
Dr. Fadoua.BOUAFIF
11. Allocation Dynamique de la mémoire
Syntaxe En C
11
La fonction malloc permet l’allocation dynamique de la mémoire, grâce à la bibliothèque
« stdlib.h »
Syntaxe: nomVariable = (type *) malloc(sizeof(type));
La fonction malloc( ) retourne l’adresse de l’espace allouer ou NULL en cas de problème d’allocation.
Exemples :
int *ptr;
Typedef Struct Personne *p;
ptr = (int *) malloc (1000 * sizeof (int)); / / réservation dynamique de la mémoire pour 1000 valeurs entières.
P= (Personne * ) malloc (sizeof(Personne )) ; /* allocation d’un espace mémoire de type struct
personne pointé par P */
Dr. Fadoua.BOUAFIF
12. Allocation Dynamique de la mémoire
Syntaxe En C (suite)
12
L’opérateur sizeof permet de déterminer la taille des éléments (en octets) devant être
réservée par la fonction d'allocation (malloc) de manière indépendante du système
d'exploitation (et du compilateur).
L'argument transmis à cet opérateur peut être une variable, un nom du tableau, un type de
données de base, une expression, ou un type de données dérivé.
Exemples:
sizeof(int); //le nombre d'octets nécessaire pour le stockage d'un entier
sizeof(Personne); // L'opérateur retourne la taille(on octet) de la mémoire nécessaire pour stocker la
structure personne.
Dr. Fadoua.BOUAFIF
13. Allocation Dynamique de la mémoire
Syntaxe En C(suite)
13
Remarques:
Si la taille de la mémoire demandée (déclaré dans la fonction d'allocation) excède ce dont dispose le
système d'exploitation, alors la fonction malloc retourne un pointeur null ( NULL ).
Il faut toujours vérifier la validité du pointeur retourné par la fonction malloc, qui ne doit pas être
nulle, afin d'éviter un comportement imprévisible ou une interruption de l'exécution du programme.
Exemple:
# include < stdlib.h >
# include < stdio.h >
………….
int * ptr ;
ptr = (int * ) malloc(1000 * sizeof (int )) ;
if (ptr == NULL)
printf (" erreur'" ) ;
Dr. Fadoua.BOUAFIF
14. Allocation Dynamique de la mémoire
Syntaxe En C
14
La fonction free permet de récupérer (ou libérer) un espace alloué dynamiquement.
La fonction prend un seul paramètre, correspondant au pointeur retourné par malloc, et
ne retourne pas de valeur.
Syntaxe: free ( NomPointeur )
Exemple :
free( ptr ); // libère l'espace mémoire alloué par la fonction malloc
free( p );
L’espace mémoire libéré par la fonction free peut être réutilisé ultérieurement par la
fonction malloc
Dr. Fadoua.BOUAFIF
15. Exercice d’application
Enoncé
15
Ecrire un programme qui lit 10 phrases d'une longueur maximale de 200 caractères au
clavier et qui les mémorise dans un tableau de pointeurs sur char en réservant
dynamiquement l'emplacement en mémoire pour les chaînes.
Inverser ensuite l'ordre des phrases et afficher par la suite le tableau résultat.
Pointeur_1
Pointeur_2
Pointeur_3
Pointeur_4
…
Pointeur_10
''Bonjour ''
''Bienvenue à la FSEGN''
''Il fait chaud''
''Je veux aller au cinéma ce week-end''
…
''Je veux apprendre à programmer en C''
Dr. Fadoua.BOUAFIF
19. Conclusion
19
Dans la programmation statique, toutes les variables occupent de l'espace en mémoire du début
jusqu'à la fin de l'exécution du programme Cela entraine un gaspillage et une mauvaise
gestion de la mémoire.
Les variables dynamiques, capable d'être crées et supprimées à tout moment, permettent, non
seulement, de simplifier l'écriture des programmes, mais garantissent en plus, une meilleure
optimisation de l'espace mémoire occupé et du temps requis à l'exécution.
Quand la mémoire est allouée dynamiquement, elle reste occupée tout le temps de l’existence du
pointeur. Il est facile de libérer ou de désallouer la mémoire à volonté dès que le ou les pointeurs
ne sont plus utiles.
L'utilisation des pointeurs est fortement liée aux structures de données dynamiques tels
que les listes, les arbres, etc.
Dr. Fadoua.BOUAFIF