Peux t'on afficher le contenu d'un pointeur ? - C - Programmation
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.
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)
Marsh Posté le 22-06-2004 à 09:12:44
me suis jamais amusé à le faire mais c'est ce que j'ai lu
pas de bonne toi ce matin
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
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
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...
Marsh Posté le 22-06-2004 à 09:16:57
oui. j'ai lu un peu vite en effet...
Marsh Posté le 22-06-2004 à 09:17:31
c'est ce que j'étais en train de me dire... mea culpa.
merci Taz
Marsh Posté le 22-06-2004 à 09:23:10
J'aimes bien quand Taz intervient
Y'a toujours une certaine animation
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 ?
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
Marsh Posté le 22-06-2004 à 18:16:54
Citation : Solution : |
Solution:
Corriger ton code buggé qui fait un overflow.
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)
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 ...
Marsh Posté le 22-06-2004 à 18:22:25
HelloWorld a écrit :
|
réalloué une 4ème fois et inclure l'adresse 0x804d21 dans mon exemple
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 ?
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.
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... :-)
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
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.
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.