Allocation dynamique
La mémoire centrale d'un ordinateur peut être vue comme un long ruban d'octets. Chaque octet possède une adresse unique. Dans les chapitres précédents, les variables ont été présentées comme un couple (identificateur, réceptacle), le réceptacle étant constitué de plusieurs octets contigus en mémoire centrale.
Nous avons vu que, connaissant la taille (le nombre d'octets) d'un réceptacle et l'adresse de son premier octet, il était possible de lire et d'écrire de l'information comme si c'était une variable : c'est une des utilisations possibles des pointeurs. Cependant, nous n'avons pas précisé où se trouvaient rangées les variables en mémoire centrale. Nous dirons simplement qu'il existe deux zones de la mémoire où on peut ranger les variables :
-
Une zone 1 qui correspond à ce que nous avons vu jusqu'à présent
-
Une zone 2 qui peut être utilisée dynamiquement par le programmeur
La première zone correspond par exemple à la déclaration ci-dessous :
void main(void)
{
int i;
float t[50];
}
Nous avons utilisée ce type de déclaration dans tous nos exemples, depuis le début de ce cours introductif. Nous allons vous présenter succinctement comment utiliser la zone 2 que l'on appelle le "tas" (heap en anglais).
Nous avons volontairement simplifié la présentation en scindant la mémoire en deux zones, la réalité est plus complexe. Les explications fournies dans ce cours introductif sont suffisantes pour l'appréhender. Néanmoins, la « carte » d'un programme qui s'exécute en mémoire centrale est plus complexe.
Ce cours introductif n'a pas pour objectif de prendre en considération des concepts trop complexes. A ce stade, ce qu'il faut retenir, c'est que l'on peut dynamiquement demander la création de nouveaux réceptacles pour des données. Ceci signifie que l'on peut allouer de l'espace pour les données au cours de l'exécution du programme.
Cette création s'effectuera dans la zone de tas. De même, on peut récupérer dynamiquement les octets qui ont été alloués. Pour cela, nous allons utiliser deux fonctions :
-
malloc
-
free
Ces fonctions sont définies dans le fichier "en-tête" « stdlib.h » qui fait partie de la bibliothèque standard définie par la norme ANSI. Ce fichier contient aussi les déclarations de fonctions traitant de conversion de chaînes de caractères en types numériques ("itoa" par exemple), de tirages aléatoires (« srand » et « rand ») et d'autres fonctions d'allocation mémoire.