Algorithmique
&
structures des données II
1ère Business Computing (BC)
Responsable : Dr. Fadoua Bouafif
1
Dr. Fadoua.BOUAFIF
Chapitre 3
Les variables dynamiques
2
Dr. Fadoua.BOUAFIF
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
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
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
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
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
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)
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
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
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
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
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
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
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
Exercice d’application
Correction
16
Dr. Fadoua.BOUAFIF
Exercice d’application
Correction
17
Exercice d’application
Exécution
18
Input
Output
avant
inversion
Output
après
inversion
Dr. Fadoua.BOUAFIF
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

ch3_les variables_dynamiques.pdf

  • 1.
    Algorithmique & structures des donnéesII 1ère Business Computing (BC) Responsable : Dr. Fadoua Bouafif 1 Dr. Fadoua.BOUAFIF
  • 2.
    Chapitre 3 Les variablesdynamiques 2 Dr. Fadoua.BOUAFIF
  • 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 programmerenferme 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 dela 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 dela 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 dela 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 dela 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 dela 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 dela 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 unprogramme 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
  • 16.
  • 17.
  • 18.
  • 19.
    Conclusion 19  Dans laprogrammation 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