Vous êtes sur la page 1sur 7

Programmation et structure des données

dynamiques

La gestion dynamique de
la mémoire

2 Principe de l’allocation dynamique

 Une variable est dite dynamique quand elle n’apparaît pas dans une déclaration
de variable explicite et ne peut être référencée directement

 Elle est alors repérée par un pointeur dont la valeur n’est générée qu’au moment
de l’exécution.

 On utilise ainsi la bibliothèque « stdlib.h » .

M. NAGALO 1
Programmation et structure des données
dynamiques

3 Demander de la place en mémoire

 Allocation d’une zone mémoire.

void * malloc (taille);


Unsigned int taille;

 Malloc retourne:
 Un pointeur sur une zone mémoire de la taille demandée en cas de succès.
 NULL en cas d’échec.

4 Demander de la place en mémoire

 Malloc (1) main()


{
char *adr;
double *ptr;
adr=malloc(10);
ptr=malloc(8);
}

 Le rôle de la fonction malloc est de retourner un pointeur sur une zone mémoire
de la taille demandée.
 Son seul argument est la taille demandée, comptée en octets. Cet argument est
de type unsigned int;

M. NAGALO 2
Programmation et structure des données
dynamiques

5 Demander de la place en mémoire

 Malloc (2)

 Parfois, le calcul à la main, de la taille d’une variable (ex: tableaux) est assez
hasardeux. Il est préférable de demander au compilateur de le faire à l’aide de
l’opérateur sizeof.
sizeof(char) ->1
sizeof(double) ->8

Ainsi adr=(char *) malloc (sizeof(char) *10);


Ptr= (double*) malloc( sizeof(double));

 On utilise sizeof pour obtenir la taille de l’objet et on convertit le type de pointeur


retourné en type désiré.

6 Demander de la place en mémoire

 Realloc
 Augmentation de la taille d’une zone précédemment allouée.
void * realloc (descripteur, size)
void * descripteur;
int size;

 Realloc alloue un nouveau tampon et y transfère le contenu du précédent


tampon. La valeur de retour est:
 Nouvelle adresse du tampon en cas de succès
 NULL en cas d’échec.

M. NAGALO 3
Programmation et structure des données
dynamiques

7 Demander de la place en mémoire

 Calloc
 Allocation d’une zone mémoire initialisée avec des caractères nuls.

void * calloc (n_elem, elem_size)


Unsigned n_elem, elem_size;

 Elle alloue un bloc de taille « n_elem » fois « elem_size » octets, et initialise ce bloc
à 0. On peut dire que c’est un tableau dont le nombre d’éléments est « n_elem »
et la taille d’un élément « elem_size », et qui est initialisé à 0;
La valeur de retour est:
 Un pointeur sur la zone allouée.
 NULL en cas d’échec.

8 Restituer de la place en mémoire allouée

Toute zone mémoire précédemment réservée par malloc ou calloc


qui n’est plus utilisée doit être libérée à l’aide de la fonction free.

void free (void * ptr) //ptr doit être l’adresse du début de cette zone.

M. NAGALO 4
Programmation et structure des données
dynamiques

9 Allocation dynamique des tableaux

Tableau à un seul indice (1)


 Dans le cas simple d’un tableau mono indicé, il y’a une équivalence formelle entre
l’identificateur du tableau et le pointeur.

 En C, l’identificateur d’un tableau, lorsqu’il est employé seul (sans indices à sa suite)
est considéré comme un pointeur (constant) sur le début du tableau.

Int t[10]; //la notation t est alors totalement équivalente à &t[0]


 L’identificateur t est considéré comme étant de type pointeur sur le type
correspondant aux éléments du tableau, c’est-a-dire int *.

10 Allocation dynamique des tableaux

Tableau à un seul indice (2)


 Ainsi :
t+1 &t[1]
t+i &t[i]
t[i] * (t+i)
 Pour allouer dynamiquement un tableau t de n entiers, on fera :

int t*;
t = (int *) malloc (n*sizeof(int));

et le pointeur t pourra s’utiliser de façon indexée comme un tableau ordinaire.

M. NAGALO 5
Programmation et structure des données
dynamiques

11 Allocation dynamique des tableaux

Tableau à un double indice (1)

Le nombre d’éléments d’une ligne est nécessaire à l’indexation. Deux cas peuvent
alors se présenter suivant qu’il s’agit d’une constante ou d’une variable.

12 Allocation dynamique des tableaux

Tableau à un double indice (2)


 S’il s’agit d’une constante

int (*t)[100]; // t est un pointeur sur un tableau de 100 entiers.

 On peut donc allouer un tableau de n lignes de 100 éléments.

t = (int (*)[100] ) malloc (n*sizeof(int [100]));

M. NAGALO 6
Programmation et structure des données
dynamiques

13 Allocation dynamique des tableaux

Tableau à un double indice (2)


S’il s’agit d’une constante
On notera les parenthèses indispensables et le type « pointeur sur un tableau de 100
éléments » utilisé dans l’opérateur « cast ». Après cette allocation, le pointeur t peut
maintenant s’employer comme un tableau à double indice.

14 Allocation dynamique des tableaux

Tableau à un double indice (2)


 S’il s’agit d’une variable

Si la taille de la ligne est variable, on peut linéariser le tableau pour mieux créer en
plus du tableau de pointeurs un autre tableau de pointeurs sur les lignes.

M. NAGALO 7

Vous aimerez peut-être aussi