MallocEn informatique, dans la bibliothèque standard du langage C, la fonction Cette fonction est déclarée dans l'en-tête MotivationIl existe trois types d'allocation de mémoire pour une variable dans un programme C : l'allocation statique, automatique, et dynamique. La fonction L'allocation statique a lieu au cours de la compilation par la déclaration de variables statiques. Ces variables là persistent durant toute l'exécution du programme. Cela concerne les variables globales et les variables locales déclarées en utilisant le mot-clé L'allocation automatique a lieu pendant l'exécution du programme sur la pile d'exécution. Il s'agit des variables locales déclarées dans un bloc d'instructions. La libération de la mémoire n'est réalisée qu'à la fin du bloc d'instructions dans lequel est déclarée la variable. Cela peut également être un facteur de gaspillage lorsque de la mémoire est allouée, mais n'est plus utilisée. C'est ici que l'allocation dynamique de mémoire entre en jeu. La réservation de la mémoire se fait au cours de l'exécution du programme, mais la libération de cette mémoire n'est plus gérée par le compilateur, mais par le programmeur. L'allocation dynamique a lieu à la demande sur le tas. Pour cela, on utilise des fonctions d'allocation de la mémoire comme UtilisationLa fonction void *malloc(size_t nbOctets);
Le seul paramètre à passer à La libération de la mémoire précédemment allouée via void free(void *ptr);
Le seul paramètre à passer est l'adresse du premier octet de la zone allouée et aucune valeur n'est retournée une fois cette opération réalisée. Voici du code réservant 20 octets et le libérant immédiatement après si l'allocation a été effectuée. #include <stdlib.h>
char * pointeur = malloc(20 * sizeof(char)); //Allocation de 20 octets (Un char est égal à 1 octet)
if(pointeur == NULL)
{
printf("L'allocation n'a pu être réalisée\n");
}
else
{
printf("L'allocation a été un succès\n");
free(pointeur); //Libération des 20 octets précédemment alloués
pointeur = NULL; // Invalidation du pointeur
}
Fonctions analoguescallocLa zone mémoire allouée par La déclaration de void *calloc(size_t nmemb, size_t size);
Le paramètre reallocLa fonction La déclaration de void *realloc(void *ptr, size_t size);
Le paramètre Si la fonction réussit, la valeur retournée est le début de la zone mémoire allouée. Attention : la valeur du pointeur
Si la fonction échoue, elle retourne la valeur tampon = realloc(tampon, nouvelle_taille);
if (tampon == NULL)
rapporterErreur();
Pour remédier à ce problème, on introduit une nouvelle variable tmp = realloc(tampon, nouvelle_taille);
if (tmp == NULL)
{
free(tampon);
rapporterErreur();
}
else
tampon = tmp;
DébogageDébogage sous WindowsDes utilitaires graphiques permettent de vérifier que la mémoire utilisée est bien libérée lorsqu'elle n'est plus utilisée, comme c'est le cas avec MFC Debugging support qui est dédié à l'API MFC de Microsoft[1]. Débogage sous GNU/Linux
Notes et références
|