Bonjour
Je pensais avoir compris le fonctionnement du malloc, mais quelque chose doit je le crains m'échapper, si quelqu'un pouvait m'expliquer là où j'ai faut, je lui en serais très reconnaissant.
Tout d'abord, sachez que pour le débuggage j'utilise une variable globale, une fonction "inline" et une macro:
que j'utilise à la place de malloc et de free, ce qui me permet de connaître le nombre de bloc mémoire alloué à un moment donné et de mettre automatiquement à NULL les pointeurs qui ne pointent plus vers rien.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 #define FREE(n) {mal--;free(n);n=NULL;} int mal=0; inline void *MALLOC(size_t n){ mal++; return malloc(n); }
J'ai une fonction récursive "interprete" qui, si l'on est dans le cas final ne fait rien, sinon commence par allouer de la mémoire, fait des effets de bords sur d'autre variable globale (uniquement des entiers), puis désalloue la mémoire.
Avant chaque appel d'interprete je stock dans une variable tmp la valeur de mal, et je vérifie que mal==tmp après l'exécution.
Une fonction "precompiler" possède un vecteur de pointeur de caractère (un vecteur de chaîne en fait). Ensuite elle boucle sur ce qui suit:on initialise avec des chaînes contenant l'unique caractère null.
dans certaines conditions on exécute
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 char* fonction[27]; for(i=0;i<27;i++){ fonction[i]=(char*) MALLOC(sizeof(char)); *(fonction[i])='\0'; }
où lettre_deb est un entier entre 0 et 26 et ligne une chaîne de caractère allouée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 FREE(fonction[lettre_deb]); fonction[lettre_deb]=ligne;
On appelle interprete, puis l'on désalloue le vecteur:
A la fin du main j'ai placé un scanf afin que la fenêtre ne se ferme pas.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 for(i=0;i<27;i++){ FREE(fonction[i]); }
J'ai placé aux endroits stratégiques de printf afin qu'au fur et à mesure que le programme s'exécute je sache où je suis et la valeur des variables importantes.
A la deuxième itération de la boucle, le programme s'arrête au moment où j'alloue le vecteur fonction avec des pointeurs sur un caractère nul. En général entre là 15ème et la 17ème allocation. (Pour le savoir, il faut que je lance le programme via la console, si je lance le programme via l'option Executer de Dev-C++ la fenêtre se ferme.
Et ceci alors que à priori la quantité de mémoire alloué est exactement la même à la première et à la deuxième itération.
Si quelqu'un est capable de m'expliquer ce que j'ai mal compris, où est mon erreur, je lui en serais très reconnaissant.
Je suis sur Win XP SP2, j'utilise dev C++4.9.9.2 avec l'installation par défaut, donc comme compilateur gcc. Mon processeur est un intel centrino duo,1,60 GHz, 2Go de ram.
Partager