IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Initiation au langage C


précédentsommairesuivant

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.

 
Sélectionnez
1.
2.
3.
int t[10];
...
/* FIN */

Peut être remplacé par :

 
Sélectionnez
1.
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 :

 
Sélectionnez
1.
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 :

 
Sélectionnez
1.
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.

 
Sélectionnez
1.
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 :

 
Sélectionnez
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 :

 
Sélectionnez
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 !

précédentsommairesuivant

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2008 Melem. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.