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); } }