Peux t'on afficher le contenu d'un pointeur ?

Peux t'on afficher le contenu d'un pointeur ? - C - Programmation

Marsh Posté le 22-06-2004 à 04:18:19    

voila j'ai quelques petits souci avec le free  
 
j'ai a un segment defaut à un free lorsque je veux librer le bloc.  
 
Dans mon cas je pense que cela est du que je ne fournis pas la bonne adresse, pas la meme que le malloc m'avait retourné.  
je suis persudé que je n'ai pas appellé 2 fois free sur le meme bloc d'ailleur
 
 
Ma question puis je vois les adresse que stocke des char *, j'ai essayé de faire avec un printf et un code format %d mais je suis pas sur que cela soit ca je crois que la meme est sauvegardé en hexa ....
 
Pourquoi je veux connaitre le contenu de mes pointeurs ?
et bien c'est pour connaitre les adresses de mes pointeurs et savoir si les adresses entre les free et les malloc corresponde.

Reply

Marsh Posté le 22-06-2004 à 04:18:19   

Reply

Marsh Posté le 22-06-2004 à 04:57:13    

%d est bon dans ton cas (i386 je suppose). Dans le cas général %ld sera plus portable... Et si tu veux afficher l'addresse en hexa, utilise %lx ou %lX.

Reply

Marsh Posté le 22-06-2004 à 07:30:59    

mais biensur ... c'est trop compliqué d'utiliser %p :o

Reply

Marsh Posté le 22-06-2004 à 09:07:38    

un free sur un bloc déjà désaloué ne devrait pas poser de problème (même si ça dénote un malfonctionnement du ton algo)


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 22-06-2004 à 09:11:32    

tu plaisantes là?

Reply

Marsh Posté le 22-06-2004 à 09:12:44    

me suis jamais amusé à le faire mais c'est ce que j'ai lu :o
 
pas de bonne toi ce matin


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 22-06-2004 à 09:13:50    

tu ferais bien de lire un peu plus, le bug/faille du double free, c'est archi connu :o

Reply

Marsh Posté le 22-06-2004 à 09:15:09    

Citation :

The free() function causes the space pointed to by ptr to be deallocated, that is, made available for further allocation. If ptr is a null pointer, no action occurs.


http://www.micro.uqam.ca/Ressource [...] /free.html


Message édité par jagstang le 22-06-2004 à 09:15:16

---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 22-06-2004 à 09:16:11    

Un pointeur qui pointe vers une zone mémoire désallouée et un pointeur a null, c'est pas la meme chose...


Message édité par Ace17 le 22-06-2004 à 09:18:03
Reply

Marsh Posté le 22-06-2004 à 09:16:57    

oui. j'ai lu un peu vite en effet...


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 22-06-2004 à 09:16:57   

Reply

Marsh Posté le 22-06-2004 à 09:17:31    

c'est ce que j'étais en train de me dire... mea culpa.
 
merci Taz :jap:


Message édité par jagstang le 22-06-2004 à 09:17:40

---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Marsh Posté le 22-06-2004 à 09:23:10    

J'aimes bien quand Taz intervient  :p  
Y'a toujours une certaine animation  :whistle:


---------------
[:whatde]
Reply

Marsh Posté le 22-06-2004 à 11:24:44    

Généralement ton compilo te fourni les outils pour détecter ce genre de cas. Tu utilises quoi ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 22-06-2004 à 17:28:48    

j'utilise gcc
 
bon mon probleme est resolu, je specifié bien la bonne adresse mais j'ai fais un debordement. Je m'explique j'ai fais une premeire allocation, j'ai utilisé la variable puis apres j'ai realloué (avec un free puis malloc), j'ai utilisé le bloc memoire.
 
Puis apres j'ai fais une 3ème reallocation. J'ai utilisé le bloc normallement. Puis apres dans mon programme j'ai voulu reutilisé ce bloc memoiire et j'ai fais un debordement. Cela n'a pas généré d'erreur car, le 3 malloc m'a fournis la meme première adresse que le premiere malloc m'avait fourni.  
 
1 er malloc :
-------------------------------------------------------------------------------
0x804d208  |             |             |                |      *         |    *      |   *      |
-------------------------------------------------------------------------------
 
3ème malloc :
-------------------------------------------------
0x804d208  |             |             |                |
--------------------------------------------------
 
les blocs du 1er malloc avec les * n'ont pas été réalloué par le systeme du coup je n'ai eu d'ereur lors de mon debordement.  
 
 
Par contre chose que je n'arrive pas a comprendre, pour moi ce n'est pas le probleme de free que j'ai fais un Overflow. Pour moi il doit librer le bloc que le 3ème malloc m'a filé et point bar ....
 
Solution :
Donc pour reseoudre mon probleme, j'ai fais un 4ème malloc pour reserver plus de bloc et ainsi eviter l'Overflow

Reply

Marsh Posté le 22-06-2004 à 17:55:48    

j'ai rien bité

Reply

Marsh Posté le 22-06-2004 à 18:16:54    

Citation :

Solution :  
Donc pour reseoudre mon probleme, j'ai fais un 4ème malloc pour reserver plus de bloc et ainsi eviter l'Overflow


Solution:
Corriger ton code buggé qui fait un overflow.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 22-06-2004 à 18:17:14    

il veux dire qu'il a écrasé de la mémoire derrière un bloc alloué par malloc, et que ça fesait planter son free ultérieur (enfin je pense)


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 22-06-2004 à 18:21:15    


ce que je veux dire, j'ai plusieurs allocation/desalocation de buf  
1 er malloc (buf = malloc (7)) :  
-------------------------------------------------------------------------------------------------------------------  
0x804d208  | 0x804d209| 0x804d210 | 0x804d211 | 0x804d212 | 0x804d213 | 0x804d214 |  
-----------------------------------------------------------------------------------------------------------------
 
 
3 ème malloc  (buf = malloc (5)) :
-------------------------------------------------------------------------------------------------------------------  
0x804d208  | 0x804d209| 0x804d210 | 0x804d211 | 0x804d212 |                   |                   |  
-----------------------------------------------------------------------------------------------------------------
 
au 1er et le 3eme malloc, on m'a fourni la meme adresse : 0x804d208.  
lorsque j'ai utilisé, le bloc du 3ème bloc, j'ai fais un debordement. J'ai ecrit sur les blocs de 0x804d208 à 0x804d12, mais j'ai également écris à l'adresse 0x804d213. J'ai fais un debordement. Lorsque j'avais fais mon 3ème malloc, j'avais reservé que jusqu'a 0x804d212. Lorsque j'ai ecris sur 0x804d213, je n'ai eu d'erreur car je pense qu'entre le 1er malloc et le 3ème malloc, l'adresse 0x804d213, n'a pas été réutilisé par le systeme.  
 
Mais du fais que j'ai ecris sur 0x804d213, lorsque j'ai voului liberer le bloc  0x804d208 -> 0x804d212 que malloc m'a fourni, free n'a pas voulu car j'ai ecris également en dehors. Cela me surprends mais ca a l'air d'etre ca ...
 
J'espere que ce coup ci je me suis fais mieux comprendre ...

Reply

Marsh Posté le 22-06-2004 à 18:22:25    

HelloWorld a écrit :

Citation :

Solution :  
Donc pour reseoudre mon probleme, j'ai fais un 4ème malloc pour reserver plus de bloc et ainsi eviter l'Overflow


Solution:
Corriger ton code buggé qui fait un overflow.


réalloué une 4ème fois et inclure l'adresse 0x804d21 dans mon exemple

Reply

Marsh Posté le 22-06-2004 à 18:47:33    

C'est quoi la question ?
Tu nous dit que du fais des overflow, tu nous explique que ça plante. Soit, c'est normal. Et ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 22-06-2004 à 18:57:31    

non ca plante pas lorsque j'ecris car j'avais precedement alloué le meme bloc et ca n'a pas été réutilisé ...
 
Mais ce qui me surprends, c'est lorsque je libere avec un free. Pour moi peu importe que je fasse un Overflow lorsque je libere c'est pas son probleme ...
 
 
Apres peut etre que cela vient du fait que j'ai ecrasé un flag que le 3ème malloc a posé necessaire pour faire un free par la suite.
Et en faisant mon  Overflow j'ai écrasé le flag et du coup le free ne sait pas ou s'arretter, il ne sait pas jusqu'a quel bloc il doit liberer. Cela vient peut etre de la.

Reply

Marsh Posté le 22-06-2004 à 19:03:52    

Faut peut-être "faire du ménage" dans la façon de traîter la mémoire, que ce soit plus "limpide" à gérer... :-)

Reply

Marsh Posté le 22-06-2004 à 19:24:17    

j'ai toujours rien bité, je comprends rien à tes calculs et suposition foireuses qui conduisent directe à l'erreur de segmentation

Reply

Marsh Posté le 22-06-2004 à 23:24:20    

Le manière dont la mémoire est gérée par la lib standard est spécifique à ton compilateur. Tes constatations ne sont pas généralisables. Sur un autre système / compilo / version de ton compilo, ça peut faire autre chose.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed