Title: 8PRO100
18PRO100
Éléments de programmation
Allocation dynamique de la mémoire
2Allocation statique et dynamique
Jusquà maintenant, toutes la mémoire que nous
avons utilisée dans nos programmes devait être
allouée avant l'exécution à laide des
déclarations de variables. Il est parfois utile
dallouer une partie de lespace mémoire en cours
dexécution.
3Exemple 1
Par exemple si on a besoin de mémoriser un
certains nombre dobjets mais que ce nombre nest
pas connu avant lexécution du programme. Il
faut alors allouer suffisament despace au cas ou
le nombre dobjets soit grand. Si le nombre
dobjets est petits, on gaspille inutilement de
lespace mémoire.
4Le fichier den-tête stdlib.h
Le fichier dentête stdlib.h contient des
déclarations de fonctions traitant, entre autres,
de lallocation de la mémoire - malloc -
free - calloc - realloc
5void malloc(size_t s)
size_t est un type dentiers positifs. malloc
retourne un pointeur sur un espace mémoire
réservé à un objet de taille s, ou bien NULL si
cette demande ne peut être satisfaite. La mémoire
allouée nest pas initialisée.
6Exemple 2
int p p 10 / INVALIDE puisque p ne pointe
sur / / aucune case mémoire valide
/ p (int) malloc(sizeof(int)) p
10 / VALIDE /
p
Avant malloc
p
Après malloc
7Exemple 2
int p p 10 / INVALIDE puisque p ne pointe
sur / / aucune case mémoire valide
/ p (int) malloc(sizeof(int)) p
10 / VALIDE /
Pourquoi?
p
Avant malloc
p
Après malloc
8Pointeurs sur void
La fonction malloc ne sait pas à quoi servira
lespace mémoire qui lui est demandée. Elle ne
sait pas quel type dobjet utilisera cet
espace. Alors, elle retourne un pointeur
générique qui peut être converti en ninporte
quel type de pointeur un pointeur sur void
9Conversion implicite
En C, certaine conversion de type sont
implicite double x int n char c n
c / un char est converti en un int / c n
/ un int est converti en un char / x n
/ un int est converti en un double / n x
/ un double est converti en un int /
10Conversion explicite
Dans toute expression, on peut forcer
explicitement des conversions de types grâce à un
opérateur unaire appelé cast. Dans la
construction (nom de type) expression lexpressio
n est convertie dans le type précisé (selon
certaines règles).
11Exemple 3
printf(d, pow(2,3)) / mauvaise façon
/ printf(d, (int) pow(2,3)) / bonne façon
/
12Exemple 4
int p struct complexe cplx p (int )
malloc(sizeof(int)) cplx (struct complexe )
malloc(sizeof(struct complexe))
13void free(void p)
free libère lespace mémoire pointé par p elle
ne fait rien si p vaut NULL. p doit être un
pointeur sur un espace mémoire alloué par malloc,
calloc ou realloc.
14void calloc(size_t nobj, size_t s)
calloc retourne un pointeur sur un espace mémoire
réservé à un tableau de nobj objets, tous de
taille s, ou bien NULL si cette demande ne peut
pas être satisfaite. La mémoire allouée est
initialisée par des zéros.
15void realloc(void p, size_t s)
realloc change en s la taille de lobjet pointé
par p. Si la nouvelle taille est plus petite que
lancienne, seul le début du contenu de lobjet
est conservé. Si la nouvelle taille est plus
grande, le contenu de lobjet est conservé, et
lespace mémoire supplémentaire nest pas
initialisé. realloc retourne un pointeur sur un
nouvel espace mémoire, ou bien NULL si cette
demande ne peut pas être satisfaite, auquel cas
p nest pas modifié.
16Exemple 5
On veut lire des entiers et les mettre en
mémoire. Plutôt que de créer un tableau avant
lexécution, on utilise calloc pendant
lexécution. int p, n scanf(d, n) p
(int ) calloc(n, sizeof(int)) si plus tard cet
espace nest plus suffisant, alors on utilise p
(int ) realloc(p, 2n)
p
17Exemple 6
Liste chaînée struct Maillon int valeur
struct Maillon suivant typedef struct
Maillon maillon maillon chaine, p
chaine
p
18Exemple 6
chaine (maillon) malloc(sizeof(maillon))
valeur
suivant
chaine
p
19Exemple 6
chaine (maillon) malloc(sizeof(maillon)) chain
e -gt valeur 8
8
chaine
p
20Exemple 6
chaine -gt suivant (maillon) malloc(sizeof(maill
on))
8
chaine
p
21Exemple 6
p chaine -gt suivant
8
chaine
p
22Exemple 6
p -gt valeur 5
8
5
chaine
p
23Exemple 6
p -gt suivant (maillon) malloc(sizeof(maillon))
8
5
chaine
p
24Exemple 6
p p -gt suivant
8
5
chaine
p
25Exemple 6
p -gt valeur 13 p -gt suivant NULL
8
5
13
0
chaine
p
26Exemple 6
p chaine while (p ! NULL) printf(d\n,
p-gtvaleur) p p-gtsuivant
8
5
13
0
chaine
p
27Exemple 6
for (pchaine p!NULL pp-gtsuivant)
printf(d\n, p-gtvaleur)
8
5
13
0
chaine
p