VI. L'allocation dynamique de mémoire▲
VI-A. Les fonctions malloc et free▲
L'intérêt d'allouer dynamiquement de la mémoire se ressent lorsqu'on veut créer un tableau dont la taille dont nous avons besoin n'est connue qu'à l'exécution par exemple. On utilise généralement les fonctions malloc et free.
2.
3.
int
t[10
];
...
/* FIN */
Peut être remplacé par :
2.
3.
4.
5.
6.
int
*
p;
p =
malloc
(
10
*
sizeof
(
int
));
...
free
(
p); /* libérer la mémoire lorsqu'on n'en a plus besoin */
/* FIN */
Les fonctions malloc et free sont déclarées dans le fichier stdlib.h. malloc retourne NULL en cas d'échec. Voici un exemple qui illustre une bonne manière de les utiliser :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
#include <stdio.h>
#include <stdlib.h>
int
main
(
)
{
int
*
p;
/* Creation d'un tableau assez grand pour contenir 10 entiers */
p =
malloc
(
10
*
sizeof
(
int
));
if
(
p !=
NULL
)
{
printf
(
"
Succes de l'operation.
\n
"
);
p[0
] =
1
;
printf
(
"
p[0] = %d
\n
"
, p[0
]);
free
(
p); /* Destruction du tableau. */
}
else
printf
(
"
Le tableau n'a pas pu etre cree.
\n
"
);
return
0
;
}
VI-B. La fonction realloc▲
La fonction realloc :
void
*
realloc
(
void
*
memblock, size_t newsize);
permet de « redimensionner » une mémoire allouée dynamiquement (par malloc par exemple). Si memblock vaut NULL, realloc se comporte comme malloc. En cas de réussite, cette fonction retourne alors l'adresse de la nouvelle mémoire, sinon la valeur NULL est retournée et la mémoire pointée par memblock reste inchangée.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
#include <stdio.h>
#include <stdlib.h>
int
main
(
)
{
int
*
p =
malloc
(
10
*
sizeof
(
int
));
if
(
p !=
NULL
)
{
/* Sauver l'ancienne valeur de p au cas ou realloc echoue. */
int
*
q =
p;
/* Redimensionner le tableau. */
p =
realloc
(
p, 20
*
sizeof
(
int
));
if
(
p !=
NULL
)
{
printf
(
"
Succes de l'operation.
\n
"
);
p[0
] =
1
;
printf
(
"
p[0] = %d
\n
"
, p[0
]);
free
(
p);
}
else
{
printf
(
"
Le tableau n'a pas pu etre redimensionne.
\n
"
);
free
(
q);
}
}
else
printf
(
"
Le tableau n'a pas pu etre cree.
\n
"
);
return
0
;
}
VI-C. Exercices▲
VI-C-1. Calcul de la moyenne (version 2)▲
Reprendre l'exercice IV-D-2 en demandant cette fois-ci à l'utilisateur le nombre de notes qu'il désire entrer (limité à exactement 5 dans l'ancien sujet). Voici un exemple d'exécution :
Ce programme permet de calculer votre moyenne scolaire.
Entrez le nombre de notes que vous voulez entrer : 5
Note 1 (0 a 20) : 14
Coef 1 (1 a 5) : 5
Note 2 (0 a 20) : 10
Coef 2 (1 a 5) : 5
Note 3 (0 a 20) : 16
Coef 3 (1 a 5) : 3
Note 4 (0 a 20) : 8
Coef 4 (1 a 5) : 1
Note 5 (0 a 20) : 12
Coef 5 (1 a 5) : 1
+------+------+----------+
| Note | Coef | Note Def |
+------+------+----------+
| 14 | 5 | 70 |
+------+------+----------+
| 10 | 5 | 50 |
+------+------+----------+
| 16 | 3 | 48 |
+------+------+----------+
| 8 | 1 | 8 |
+------+------+----------+
| 12 | 1 | 12 |
+------+------+----------+
| Tot. | 15 | 188 |
+------+-----------------+
| Moy. | 12.53 |
+------+-----------------+
Merci d'avoir utilise ce programme. A bientot !
VI-C-2. Recherche dans un tableau (version 2)▲
Reprenez l'exercice IV-D-1 en remplaçant les nombres par des chaînes de caractères. L'utilisateur entrera en premier lieu
le nombre de chaînes qu'il va entrer.
Aucune chaîne ne doit excéder 20 caractères
mais la mémoire que vous utiliserez pour stocker chaque chaîne entrée doit être juste assez grande pour la contenir. Autrement dit,
votre objectif sera de minimiser la quantité de mémoire utilisée. Voici un exemple d'exécution :
Ce programme permet de trouver toutes les occurrences d'une chaine.
Combien de chaines voulez-vous entrer ? 10
Entrez 10 chaines de caracteres (20 caracteres par chaine au plus) :
t[0] : programmation
t[1] : langage
t[2] : C
t[3] : ANSI
t[4] : ISO
t[5] : IEC
t[6] : programmation
t[7] : programme
t[8] : code
t[9] : programme
Entrez la chaine a rechercher : programmation
t[0]
t[6]
2 occurrence(s) trouvee(s).
Merci d'avoir utilise ce programme. A bientot !