Programmation bas niveau (BNV) Help

Cours : La manipulation de la mémoire

On l'a vu précédemment l'ordinateur peut prendre les devants pour réserver la place dont vous aurez besoin lorsque vous déclarez un char * en dur. Mais il est aussi intéressant de pouvoir soi-même réserver et libérer de la place en mémoire.

Pour faire ça on utilise principalement deux fonctions : malloc() (pour memory allocation) et free().

Allouer de la mémoire

Si je veux réserver de la mémoire, je dois appeler malloc en lui disant combien de segments, je veux réserver et pour quel type de données.

malloc et free sont toutes les deux contenues dans <stdlib.h>, ça tombe bien, vous l'incluez déjà pour pouvoir utiliser exit.

Le prototype de malloc

Le prototype de malloc est aussi un peu particulier :

void * malloc(size_t tailleNecessaire);

Ici void * ne signifie pas "pointeur sur le vide", mais "pointeur dont one ne connait pas le type à l'avance". En effet malloc permet d'attribuer de la mémoire pour tous les types de variables et donc ne sait pas à l'avance sur quoi cela va pointer.

size_t est un type que vous ne connaissez pas encore, mais sachez qu'il s'agit en gros d'un entier qui ne peut pas être négatif.

Comment l'utiliser ?

Imaginons que je veux allouer de la mémoire pour la chaine de caractères "Hello World!\n". Nous avons vu dans le cours précédent qu'il nous fallait la taille de 13 char + un caractère \0 donc 14 char.

Nous allons donc l'écrire de la façon suivante :

char * str = malloc(14 * sizeof(char));

En français ça donnerait : "J'ai besoin d'un espace qui fasse 14 fois la taille d'un caractère".

str pointe à présent sur la première case d'un segment de mémoire qui fait 14 octets (puisqu'un char == 1 octet).

Lorsque vous allouez de la mémoire à une chaine de caractère la première chose à faire est de placer votre caractère \0 à la fin pour éviter d'avoir des problèmes ensuite :

char * str = malloc(14 * sizeof(char)); str[13] = '\0';

Et si je veux un tableau de nombres ?

Le principe reste le même. Si je veux créer un tableau de nombres pour créer, stocker des notes (ici, on va arbitrairement dire que l'on stocke 5 notes) par exemple :

int * grades = malloc(6 * sizeof(int));

Par contre, nous avons un problème, '\0' c'est l'équivalent du nombre 0. Sauf qu'un étudiant pourrait tout à fait avoir une note qui vaut 0. Vous allez donc soit devoir savoir quelle taille fait votre tableau, soit définir une autre valeur qui ne peut pas être dans votre liste.

Si on imagine qu'un étudiant ne peut avoir en dessous de 0 on va donc faire quelque chose qui ressemble à ça :

int * grades = malloc(6 * sizeof(int)); grades[5] = -1;

et au lieu de parcourir votre tableau jusqu'à trouver un '\0' vous allez le parcourir jusqu'à trouver -1:

int * grades = malloc(6 * sizeof(int)); grades[5] = -1; int i = 0; while(grades[i] != -1) { printf("%d / 20\n", grades[i]); i = i + 1; }

Libérer la mémoire

Attention toute mémoire que vous avez alloué, vous devez la libérer sinon votre programme aura ce qu'on appelle une memory leak (une fuite de mémoire).

Tout pointeur que vous avez malloc doit être free avant d' exit votre programme.

int main() { char * str = malloc(14 * sizeof(char)); str[13] = '\0'; // utilisation de str free(str); exit(0); }
13 October 2025