Section courante

A propos

Section administrative du site

Introduction

Les structures dynamiques permettent d'indiquer que tous les éléments sont de cardinalité infinie. Ainsi, le nombre d'éléments peut varier durant l'exécution du programme. Il s'agit en quelque sorte d'une utilisation de la mémoire vive sur demande. On retrouve donc parmi ceux-ci : les chaînes, les listes, les arbres, les graphes,...

Les pointeurs

Pour réussir à obtenir un résultat variant autant, on se base sur un pointeur contenant une adresse vers une autre variable dynamique provenant généralement de la mémoire de tas (ou Heap en anglais). Grâce à cette technique, il n'est pas nécessaire de réserver une taille fixe de mémoire au lancement du programme, on peut ainsi décidé au fur et à mesure des circonstances utilisateurs de prendre uniquement la partie de mémoire nécessaire et ainsi laisser la mémoire n'étant pas nécessaire aux programmes, processus et au système d'exploitation.

Lorsqu'un pointeur n'est pas utilisé ou pointe vers une aucune adresse, on le fait pointer vers ce que l'on appel «NIL» (en référence au fleuve d'Egypte) ou «NULL» (pour indiqué une valeur nulle) soit une forme d'adressage vers un segment 0.

Exemples

L'exemple suivant montre la technique d'allocation de mémoire d'un pointeur inclus en standard dans le langage de programmation C, avec la fonction «malloc» :

Essayer maintenant !
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6.     int * p = malloc(20 * sizeof(int));
  7.     if(NULL != p) {
  8.         int I;
  9.         for(I = 0; I < 20; I++) {
  10.             p[I] = 1000-(I * 10);
  11.         }
  12.         printf("Valeur p[15] = %i\n",p[15]);
  13.         free(p);
  14.     } else {
  15.         printf("Impossible d'allouer de la mémoire dynamiquement !\n");
  16.     }
  17.     return 0;
  18. }

on obtiendra le résultat suivant :

Valeur p[15] = 850

Voici quelques exemples typiques de l'utilisation de la fonction «GetMem» en Turbo Pascal :

Essayer maintenant !
  1. Program GemMemSamples;
  2.  
  3. Type
  4.  TInteger = Array[0..20] of Integer;
  5.  
  6. Var
  7.  P:^TInteger;
  8.  I:Integer;
  9.  
  10. BEGIN
  11.  GetMem(P,20 * SizeOf(Integer));
  12.  If NIL <> P Then Begin
  13.   For I := 0 to 19 do P^[I] := 1000-(I * 10);
  14.   WriteLn('Valeur P^[15] = ',P^[15]);
  15.   FreeMem(P,20 * SizeOf(Integer));
  16.  End 
  17.   Else 
  18.  Begin
  19.   WriteLn('Impossible d''allouer de la mémoire dynamiquement !');
  20.  End;
  21. END. 

on obtiendra le résultat suivant :

Valeur p[15] = 850

Ramasse-miette

Lorsque le traitement sur la variable pointer par le pointeur est terminé, on effectue sa libération de l'espace mémoire dans la mémoire de tas. Elle est donc disponible pour les autres variables de pointeurs pour être alloué pour des futures besoins. L'ennui avec cette technique c'est qu'avec le temps on se ramasse avec des fragments de mémoire éparpillé dans la mémoire de tas et même si la mémoire dans le tas contient assez de mémoire pour répondre à cette demande, il ne lui est pas possible d'allouer de la mémoire car elle ne pas disponible en un bloc continue. Pour résoudre se problème, on doit soit lancer manuellement un ramasse-miette ou il est exécuté automatiquement par le système ou le langage de programmation. L'inconvénient de cette technique est que lorsqu'elle est lancé automatiquement ou manuellement, elle peut durée on long moment : plusieurs secondes, voir quelques minutes !

Chainage des trous

Cette technique consiste à retenir l'emplacement mémoire de chaque bloc de mémoire alloué ainsi que sa taille. On recherche ensuite le trou le plus petit pouvant correspondre à la demande. Cette technique est utilisé par exemple pour le langage de programmation du Turbo Pascal.



Dernière mise à jour : Jeudi, le 6 avril 2017