L'allocation dynamique
L'allocation dynamique permet de rendre un programme plus performant notamment en utilisant juste la mémoire nécessaire et non une variable "classique".
Grâce à l'allocation dynamique, il vous sera possible d'allouer vous-même de la mémoire vive sans passer par une variable.
Je pense que vous ne voyez pas trop l'intérêt mais rassurez-vous, vous allez le découvrir très bientôt
Avant toute chose, rappelez-vous de la fontion sizeof. Je vous avais dit qu'il permettait de connaître la taille d'une variable. Et bien grâce à lui, vous pouvez aussi connaître la taille d'un type de variable!
Exemple:
sizeof(long);
Ce qui vous affichera si vous utilisez printf comme ceci:
printf
("Long: %d octets.", sizeof(long));
Ce qui veut dire que lorsque vous créez une variable de type long, 4 octets seront alloués dans la mémoire de l'ordinateur alors que vous n'avez peut-être besoin que de juste 1 octet.
Sur les ordinateurs actuels, cela ne pose plus du tout de problème tellement la quantité de mémoire vive est importante. Cependant, si vous faites de la robotique par exemple, le programme aura certainement moins de mémoire vive possible et il sera très important d'économiser au maximum cette mémoire.
Pour faire ceci, il faut impérativement maîtriser le chapitre sur les pointeurs.
Lorsque vous créez une variable, voici les opérations exécutées par le programme:
1) Le programme demande à l'ordinateur un espace de mémoire vive libre pour qu'il puisse y stocker une valeur.
2) L'ordinateur répond par l'affirmative (la seule erreur éventuellement possible serait de ne plus avoir de mémoire vive. Ce qui est, je ne vous le cache pas, extrêmement peu courant

) et fournit au programme un pointeur pointant sur la zone mémoire réservée.
3) Le programme utilise cette zone mémoire.
4) Enfin, lorsque le programme n'a plus besoin de cette zone mémoire il la rend à l'ordinateur.
Nous allons maintenant voir comment réaliser ceci en langage C
Tout d'abord, il faut demander une zone mémoire de disponible à l'ordinateur. Pour cela, il suffit d'utiliser la fonction malloc.
Voici son prototype:
void *malloc(size_t size);
Elle prend comme seul paramètre le nombre d'octets à allouer. Cette fonction renvoie un pointeur sur la zone mémoire réservée ou renvoie NULL en cas d'erreur.
Exemple:
#include <stdlib.h>
#include <stdio.h>
int main()
{
int *pointeur = NULL;
pointeur = malloc(10); //On alloue 10 octets.
if(pointeur == NULL)
printf("Impossible d'allouer de la memoire!");
else
printf("Memoire allouee avec succes!");
return 0;
}
Ce code alloue à l'OS (Operating System = Système d'exploitation) 10 octets de mémoire vive.
Mais ce code n'est pas correct!
En effet, il faut
impérativement libérer la mémoire allouer à la fin de son utilisation!
Ceci est possible grâce à la fonction free qui prend comme seul paramètre, le pointeur pointant vers la zone mémoire à libérer.
Exemple de code complet correct:
#include <stdlib.h>
#include <stdio.h>
int main
()
{
int *pointeur
= NULL
;
pointeur
= malloc
(10); //On alloue 10 octets.
if(pointeur
== NULL
)
printf
("Impossible d'allouer de la memoire!");
else
{
printf
("Memoire allouee avec succes!");
free
(pointeur
); //On libère la mémoire allouée.
}
return 0;
}
Remarquez que le free se situe bien dans la condition "else" qui indique que la zone mémoire a bien été allouée. Si vous essayez de faire un free avec un pointeur pointant sur NULL car l'opération de "malloc" n'a pas réussi, vous aurez une erreur. Attention donc.
Essayons de faire un petit programme d'exemple pour mieux se faire à l'allocation dynamique.
Ce programme consistera à demander l'année de naissance à l'utlisateur et de lui redonner en utilisant les pointeurs ainsi que les allocations de mémoire (ici, l'allocation est limite inutile, mais il ne s'agit là que d'un exemple

):
#include <stdlib.h>
#include <stdio.h>
int main
()
{
int *pointeur
= NULL
; //On creer un pointeur.
printf
("Veuillez rentrer votre annee de naissance: ");
pointeur
= malloc
(sizeof(int)); //On alloue la "taille" d'un int.
if(pointeur
== NULL
)
printf
("ERREUR DU PROGRAMME!");
else
{
scanf
("%d", pointeur
);
system
("cls"); //On efface l'écran.
printf
("Vous etes ne en %d.", *pointeur
);
free
(pointeur
); //On désalloue la mémoire.
}
return 0;
}
Ce qui fait apparaître:

Pour l'instant vous pensez certainement que cela complexifie pour rien votre programme, mais je peux vous assurez que l'allocation dynamique est parfois bien utile
Ce cours chapitre de terminé, je vous propose de poursuivre ce cours avec, comme dernier chapitre (et oui le temps passe vite

), une explication des propriétés des applications windows.
Les fichiers Les propriétés des exécutables