Allocation Dynamique

Transcription

Allocation Dynamique
Étape 7
Allocation Dynamique
Les pointeurs permettent de stoker une adresse mémoire à laquelle se trouve une
donnée. Par exemple : double *p déclare un pointeur sur un double. Attention,
la zone mémoire utilisée pour stocker le double n’est pas allouée lors de la
déclaration du pointeur.
Cette zone mémoire peut être allouée de deux façons :
1. en déclarant une variable du type ;
int main(void){
double *pv, *pt;
double v, t[100];
pv=&v;
pt=t;
}
2. en allouant dynamiquement de la mémoire. La mémoire se réserve par la
fonction malloc par exemple, qui prend en paramètre la taille en nombre
d’octets à allouer et retourne un pointeur sur la zone allouée.
#include <stdlib.h>
int main(void){
double *pv, *pt;
pv = malloc(sizeof *pv);
pt = malloc(100 * sizeof *pt);
}
Il est alors tout à fait possible d’utiliser pv comme un pointeur sur double et pt
comme un tableau de double.
Remarquez que la fonction malloc appartient à une librairie appelée stdlib.h.
Il existe plusieurs fonctions permettant d’allouer dynamiquement de la mémoire.
La section 3 du manuel vous permettra d’avoir une description complète de ces
fonctions (man malloc). Nous décrivons ici deux de ces fonctions :
— void * malloc(size_t size) permet d’allouer size octets et retourne
un pointeur sur la mémoire allouée ;
— void * calloc(size_t count, size_t size) permet d’allouer count
objets de taille size octets, remplit cette mémoire avec des 0 et retourne
un pointeur sur la mémoire allouée ;
1
2
ÉTAPE 7. ALLOCATION DYNAMIQUE
En cas d’erreur, ces fonctions retourne NULL.
Il est recommandé également de connaître les autres fonctions d’allocations
(realloc, valloc).
Attention, lorsque vous allouez de l’espace mémoire en utilisant l’une de ces
fonctions, cet espace reste allouer tout au long de l’exécution de votre programme. Vous pouvez donc allouer de la mémoire dans une fonction, retourner
l’adresse de cette zone mémoire et utiliser cette mémoire tout au long de votre
programme. Par contre, si vous effacez l’adresse de cette zone (en modifiant la
donnée stockée dans le pointeur), il est impossible de retrouver l’adresse.
Le programme suivant produit un exemple de “fuite mémoire”.
#include <stdlib.h>
int main(void){
char *pt;
for(;;)
//Allocation d’un Mega Octet a chaque tour de boucle
pt = malloc(1024 * 1024 * sizeof *pt);
}
Enfin, il est nécessaire de libérer la mémoire que l’on a allouée. La fonction free
prend en argument une adresse et libère la zone mémoire allouée à cette adresse.
#include <stdlib.h>
int main(void){
double *pt;
for(;;){
//Allocation d’un Mega Octet a chaque tour de boucle
pt = malloc(1024 * 1024 * sizeof *pt);
free(pt);
}
}