• Aucun résultat trouvé

Fiche n°17 : Gestion de la mémoire en C

N/A
N/A
Protected

Academic year: 2022

Partager "Fiche n°17 : Gestion de la mémoire en C"

Copied!
3
0
0

Texte intégral

(1)

Fiche n°17 : Gestion de la mémoire en C

Nous revenons au langage C pour donner quelques compléments concernant la gestion dynamique de la mémoire.

Nous connaissons déjà la fonction malloc qui réserve un bloc mémoire et en retourne l’adres- se, et nous avons déjà évoqué la fonction free qui libère un bloc mémoire dont on lui trans- met l’adresse en paramètre.

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

*p=10.0;

printf("%lf\n",*p);

free(p);

Réserve un bloc permettant de stocker une valeur de type double.

Assigne une valeur à la variable dynamique ainsi créée et affiche cette valeur.

Libère le bloc mémoire

La fonction void* calloc(unsigned int n, unsigned int size) est une variante qui réserve un bloc mémoire de taille n * size et qui initialise ce bloc avec des 0. Elle est plus spécia- lement dédiée à la création de tableaux de n cellules de taille size.

La fonction void* realloc(void* p, unsigned int size) Permet de réallouer un bloc plus grand ou plus petit que celui pointé par p. Le nouveau bloc n’est pas nécessairement situé à la même adresse que l’ancien. L’ancien est détruit. Les valeurs de l’ancien bloc sont recopiées dans le nouveau, à hauteur de la place disponible. Si le paramètre p vaut NULL, alors real- loc devient équivalent à malloc.

Typiquement, realloc est utilisée pour re dimensionner un tableau dynamique.

int* tab;

tab=(int*)calloc(5,sizeof(int));

tab[2]=11;

tab=(int*)realloc(tab,10*sizeof(int));

tab[8]=22;

free(tab);

Création d’un tableau dynamique de 5 int.

Utilisation du tableau…

Agrandissement du tableau.

Utilisation du tableau agrandi…

Destruction du tableau.

Exemple d’application.

Réalisez une pile d’entiers extensible dont la taille s’adapte à la quantité de valeurs empilées. Réalisez et testez sur machines les fonction permettant de créer une pile, d’empi- ler une valeur et de dépiler une valeur. Vous devez bien sûr utiliser la fonction realloc.

(2)

Fiche n°18 : Structures autoréférentes en C

On appelle strucure autoréférente une structure dont l’un des champs est un pointeur une structure de même type. Ce principe est utilisé par exemple pour représenter des listes chaînées, des arbres ou des graphes.

Un exemple : pile d’entiers chaînée.

typedef struct _maillon {

int val;

struct _maillon* suiv;

}maillon;

Chaque maillon comporte un entier et un lien vers le maillon suivant.

typedef struct {

maillon* sommet;

}pileInt;

Une pile comporte un lien vers le premier maillon, appelé sommet.

void testPile() {

pileInt p;

initPile(&p);

empile(&p,11);

empile(&p,22);

printf("%d %d\n",depile(&p),depile(&p));

}

void empile(pileInt* p, int x) {

maillon* newm;

newm = (maillon*)malloc(sizeof(maillon));

newm->suiv=p->sommet;

newm->val=x;

p->sommet=newm;

}

int depile(pileInt* p) {

maillon* s = p->sommet;

int val = s->val;

p->sommet=s->suiv;

free(s);

return val;

}

Test consistant à empiler deux valeurs, puis à les dépiler et les afficher.

(3)

Fiche de préparation n°5

Vous devez réfléchir à une autre représentation d'une pile d'entiers basée sur le modèle suivant :

Une pile est soit vide, soit constituée d'un sommet et d'une queue, qui est elle même soit une pile vide, soit une constituée…

Il faut donc déterminer comment représenter une pile vide et comment représenter une pile non vide. Une solution consiste à représenter une pile non vide par un pointeur sur une structure comportant les champs appropriés, et une pile vide par un pointeur ayant la valeur NULL. Une autre solution consiste à représenter toute pile, même vide, par une structure comportant notamment un champ particulier dont la valeur indique si la pile set vide ou pas.

Tentez d'implanter l'un ou l'autre de ces modèles et de déterminer leurs avantages et incon- vénients.

Références

Documents relatifs

Exemple.- ´ Ecrivons un programme QBasic qui demande un entier naturel (de deux octets) et fait appel ` a un sous-programme en langage machine qui passe la valeur en

• une m´ethode ajouter() dont le seul param`etre est l’entier dont une oc- currence est ` a ajouter au multi-ensemble (si celui-ci n’est pas plein), qui renvoie true si on a pu

– à créer la pile comme un objet récursif (une pile est vide ou bien constituée d'un élément qui est son sommet et d'une pile) … voir question a) ci-dessous ;. – à créer

On pourrait prouver ce dernier r´esultat, ainsi que le premier lemme de la section, hh ` a la main ii ` a partir des r´esultats d’approximation, sans utiliser le th´eor`eme de

Chaînes bien parenthésées Calculatrice en polonaise inversée Percolation. 1 La structure

creer() crée et retourne une nouvelle pile, initialement vide (en anglais : create()) ; 2. est_vide(p) retourne True si la pile est vide, False dans le cas contraire (is_empty(p))

On s’intéresse dans tout ce problème à une suite infinie de lancers d’une pièce équilibrée autour duquel deux joueurs J et J 0 s’affrontent. Le joueur J l’emporte si

Sans mati` ere (¸c-` a-d dans le vide) , ce terme est nul , il n’y a pas d’interaction des champs avec des charges inexistantes et ∂u ∂t em + div R ~ = 0 ; alors si le premier