La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

8PRO100 Éléments de programmation Allocation dynamique de la mémoire.

Présentations similaires


Présentation au sujet: "8PRO100 Éléments de programmation Allocation dynamique de la mémoire."— Transcription de la présentation:

1 8PRO100 Éléments de programmation Allocation dynamique de la mémoire

2 Allocation 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.

3 Exemple 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.

4 Le 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

5 void *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.

6 Exemple 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 Après malloc

7 Exemple 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 Après malloc Pourquoi?

8 Pointeurs 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

9 Conversion 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 */

10 Conversion 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 lexpression est convertie dans le type précisé (selon certaines règles).

11 Exemple 3 printf(%d, pow(2,3));/* mauvaise façon */ printf(%d, (int) pow(2,3));/* bonne façon */

12 Exemple 4 int *p; struct complexe *cplx; p = (int *) malloc(sizeof(int)); cplx = (struct complexe *) malloc(sizeof(struct complexe));

13 void 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.

14 void *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.

15 void *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é.

16 Exemple 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, 2*n); p: …

17 Exemple 6 Liste chaînée struct Maillon{ int valeur; struct Maillon *suivant; }; typedef struct Maillon maillon; maillon *chaine, *p; chaine: p:

18 Exemple 6 chaine = (maillon*) malloc(sizeof(maillon)); chaine: p: valeursuivant

19 Exemple 6 chaine = (maillon*) malloc(sizeof(maillon)); chaine -> valeur = 8; chaine: 8 p:

20 Exemple 6 chaine -> suivant = (maillon*) malloc(sizeof(maillon)); chaine: 8 p:

21 Exemple 6 p = chaine -> suivant; chaine: 8 p:

22 Exemple 6 p -> valeur = 5; chaine: 8 5 p:

23 Exemple 6 p -> suivant = (maillon*) malloc(sizeof(maillon)); chaine: 8 5 p:

24 Exemple 6 p = p -> suivant; chaine: 8 5 p:

25 Exemple 6 p -> valeur = 13; p -> suivant = NULL; chaine: 8 5 p: 130

26 Exemple 6 p = chaine; while (p != NULL){ printf(%d\n, p->valeur); p = p->suivant; } chaine: 8 5 p: 130

27 Exemple 6 for (p=chaine; p!=NULL; p=p->suivant) printf(%d\n, p->valeur); chaine: 8 5 p: 130


Télécharger ppt "8PRO100 Éléments de programmation Allocation dynamique de la mémoire."

Présentations similaires


Annonces Google