Il existe 2 types d’allocation. L’allocation statique, et dynamique.
Statique, c’est lorsque tu utilises une variables, un tableau, …
| int a = 0;
char tab[256] = "";
|
Ces variables sont stockées dans ce qu’on appele la pile. Lorsque le programme est chargé par le Système d’Exploitation, celui-ci aloue un espace de taille fixe pour le programme. Cet espace s’appel la pile. Ça peut paraitre évident mais si ça s’appele la pile, c’est que ça fonctione comme la structure de donnée du même nom vie-à-vie des appeles aux fonctions. On ne s’occupe pas de cet espace, c’est le SE qui s’en occupe.
Étant donné que la pile à une taille limité, on peut demander au SE d’alouer de l’espace mémoire aileurs que dans la pile. C’est l’allocation dynamique. On utilise pour cela les fonctions de la fammile de malloc
. On appele cet espace le tas. L’allocation n’y est pas géné par le SE (pas uniquement). On doit absolument signaler aux SE que l’on utilise plus un espace mémoire. On le fait en utilisant la fonction free
(ou realloc avec 0 en taille).
Tant qu’on utilise de l’allocation statique, on ne s’occupe presque pas de la mémoire. Quand on fait de l’allocation dynamique, on est plus libre mais on doit absolument faire attention de bien tout gérer.
Bref, si ton buffer est :
Alors tu n’as pas à le libérer puisque tu n’as pas à utiliser malloc
. Par-contre, tu dois savoir qu’il a une “porté” locale. C’est-à-dire que la durée de vie de cette variable est cantonné aux crochets qui l’entoure :
| char* t = NULL;
{
char tab[256] = "";
t = tab;
// Ici tab existe
// t à du sens
}
// Ici, tab n'existe pas et le pointeur t n'a plus de sens
|
De même :
| char* foo(void) {
int tab[11] = {0};
return tab;
}
|
Ici, retourné tab
est une grave erreur. Ça pourrait fonctionner comme ne pas marcher. tab
a une durée de ie limitée et à la fin de l’execution de la fonction, tab
n’existe plus et serra rapidement écrasé.
Les variables static :
| void food(void) {
static int tab[11] = {0};
}
|
Ici, le tableau (ça pourrait être n’importe qu’elle variable hors VLAs) à une portée limitée à la fonction mais une durée de vie globale (comme une variable globale), c’est-à-dire que retournée une référence vers la variable à du sens.
Bref, j’espère qu’avec tout ça tu peux saisir toutes les subtilités
Attention avec asvprintf
. Ce n’est pas une fonction standard. Ce qui implique que l’existance de cette fonction n’est pas assurée.
Voila, j’ai fini mon monologue >_<"