Taille d'une zone mémoire en C

Voilà mon problème est simple:
J’ai un pointeur qui pointe sur une zone mémoire inconnue alloué par malloc, mais bien sur ce n’est pas moi qui l’ai allouée donc je ne connais ni son type ni sa taille.
La question est donc simple comment connaitre la taille de cette zone mémoire en octet?

Donc si les experts en C de la caf avait une idée car la je suis à cours.

Merci.

Tu parcours le tout jusqu’au segfault?

ok je sors

Nan plus sérieusement, ça fait longtemps que j’ai pas touché à C, mais sizeof est pas censé faire ça?
Ce message a été édité par BodySplash le 22/06/2004

Perso je comprends pas trop ta question. Qu’est-ce que tu entends par “ce n’est pas moi qui l’ai allouée” ? si elle allouée dans ton programme, tu dois bien en connaître la taille. Si elle est allouée par un autre processus, tu n’as de toute façon pas le droit d’y toucher sous peine de segfault.
Par ailleurs si la mémoire est simplement allouée, mais qu’il n’y a rien dedans, je doute que sizeof renvoie un résultat pertinent.

Ce message a été édité par morvinet le 22/06/2004

ou bien il récupère un pointeur sur struct ou autre issue d’une fonction d’une libraie quelconque, et en lisant la doc, il devrait pouvoir connaitre sa structure…

Non. A priori: tu l’as dans le derriere. Ou tu peux deviner la taille de memoire qui a ete alouee (genre tu sais qu’il y a 50 elements de type struct machin), ou une image en 32bpp qui fait 120x120 plus un header, blabla), ou on te le dit explicitement, ou ton pointeur est inutilisable a moins de ne faire que le passer a quelqu’un qui sait.

Je représise :
Une fonction à laquelle je n’ai pas accès alloue une zone mémoire. uis ma fonction est appelée en me passant juste le pointeur sur la zone. En fait ma fonction est juste la pour libérer cette mémoire allouée via une free(). Mais je désire conaître la taille de la zone mémoire avant de la libérer tout simplement.

Le sizeof : Ben ça marche pas tout simplement car ce n’est un un type de données déclaré. Exemple:
sizeof(int); --> retourne la taille d’un entier
int i; sizeof(i); --> retourne toujour la taille d’un entier puisque i est du type entier
prt = malloc(255); sizeoff (ptr); --> retourne la taille tu pointeur et non pas de ce qu’il pointe. Car ce qui est pointé par le pointeur n’est pas un type definie.

autre idée ?

[quote]Une fonction à laquelle je n’ai pas accès alloue une zone mémoire.[/quote] De ton programme donc ? D’une lib ? Tu ne nous aide pas trop a comprendre.

[quote]Puis ma fonction est appelée en me passant juste le pointeur sur la zone. En fait ma fonction est juste la pour libérer cette mémoire allouée via une free(). Mais je désire conaître la taille de la zone mémoire avant de la libérer tout simplement.[/quote] Impossible. Modifie la fonction d’allocation pour que tu puisses récupérer d’une manière ou d’une autre la taille.

Ce message a été édité par C_Wizard le 22/06/2004

[quote]prt = malloc(255); sizeoff (ptr); --> retourne la taille tu pointeur et non pas de ce qu’il pointe. Car ce qui est pointé par le pointeur n’est pas un type definie.

autre idée ?[/quote]c’est normal que sizeoff(ptr); te renvoie la taille d’un pointeur mais sizeoff(*ptr);
c’est impossible? je sais pas ce que ca peut donner sur un pointeur void mais logiquement ca devrais marcher…

[quote][quote]c’est normal que sizeoff(ptr); te renvoie la taille d’un pointeur mais sizeoff(*ptr); c’est impossible? je sais pas ce que ca peut donner sur un pointeur void mais logiquement ca devrais marcher…[/quote]Non normalement ca devrait pas [/quote]Si je dis pas de connerie, ca devrait renvoyer la taille de ton pointeur de pointeur…

Vous avez tous gagnez le droit de reviser votre C !

L’allocateur par defaut du C stock des infos sur le bloque memoire, 1 ou 2 octects juste avant le pointeur, donc normalement, si tu regarge a (unsigned int*)((unsigned char)ptr - 1)
ou -2… ca devrait etre la !
ou -4 en fait, depuis que tout le monde est passer en 32bit… code du matin… chagrin…

sinon tu peut aussi utiliser _msize si tu es sous VC++, mais attention : c’est super pas portable.

Et l’aute detail c’est que quelque soit la methode (-1 ou msize), il est possible que la taille retourner soit un chouille plus grande que celle allouee : pour pouvoir prendre en compte les problemes d’alignement et de taille minimum de bloque !

Et Hop !

Enfin cela dit, c’est pas tres propre, et stocker la taille quelque part, si tu en as vraiment besoin, devrait etre plus intelligent, et moins dangereux.

5ug4r 3d1t
Ce message a été édité par c0unt0 le 22/06/2004

C’est pas std si? C’est plus un detail d’implementation de la maniere dont est allouee la memoire qui peut changer. Mefiance… c’est cracra Joli hack cela dit!

Ahahah c0unt0, super le tricks 100% pas portable NON ce n’est pas standard de stocker la taille du buffer juste avant celui-ci, et d’ailleurs ça peut changer entre release et debug par exemple. Eh oui.

Donc pour répondre à la question initiale : à part d’un pointeur alloué par malloc, il n’y a aucun moyen standard en C ANSI d’obtenir la taille de la zone mémoire allouée.

Quant à tous ceux qui ont répondu sizeof(toto) et autres sizeof(*toto), vous allez me faire le plaisir de réviser le C d’urgence ! Parce que la, vous avez un sérieux problème avec les pointeurs :stuck_out_tongue:

(edit : d’ailleurs certains allocateurs mémoire ne stockent pas la taille mémoire allouée, mais l’adresse du prochain bloc, d’où ils déduisent la taille… eh oui eh oui… le monde est mal fait…)

Ce message a été édité par tuo le 22/06/2004

Bon je passais par la et j’ai vu de la lumiere, et surtout, je me suis demande pourquoi le monsieur avait besoin de la taille alloue pour faire un free.

Hein Monsieur, dis nous pourquoi

Enfin en C, on fait des trucs tellement genial comme appeller une fonction qui nous renvoit un truc qui nous sert a rien MAIS qu’on doit liberer parce que justement, on en a pas besoin. C’est fort.

LoneWolf
Tout faire avec le C, meme l’inutile.

Juste histoire de dire : c’est pas super portable, soit, mais je l’ai vu implemente comme ca (ou pas loin, voir pointer de tuo) sur la plus part des plateformes sur lesquels j’ai travaille !

Donc bon, c’est pas standard, mais c’est jouable

Oh oui c’est jouable, tu peux même généralement trouver le gestionnaire mémoire fournit avec les sources (en partie dans la CRT de Visual par exemple), donc en déduire les infos dont t’as besoin… Mais je persiste : c’est tout sauf standard ! Ca pue le gros hack bien baveux, donc à éviter :stuck_out_tongue:

C’est un beau Hack dont je me rappellerai

Mais que je deconseillerai au debutant C quant meme

Sinon j’ai toujours pas capté comment il fesait un alloc sans savoir de combien…

Tu peux envoyer les protos ?

Koubiiak

Bien alors le monsieur va tout vous dire. C’est simple je traque les fuites mémoire dans un programme en C. Mais comme je n’ai pas les sources de l’intégralité du programme j’ai eu l’idée de compter le nombre de malloc, calloc, realloc et free avec l’espace alloué ou libéré et ceci via une librairie d’interposition. Donc les allocations c’est nickel ça marche bien, et pour le free j’arrive bien à avoir le nombre de free appelé. Mais impossible d’avoir la taille mémoire libérée par free donc de verrifier si la mémoire allouée correspond bien à la mémoire libérée. Sans compter bien évidement qu’il y a plus d’allocation mémoire que de free.

Voilà vous savez tout comme ça.

Moi quand ya un truc qui me chagrine comme Rufh, je hack et c’est dans la joie .
Déjà, t’as essayé le hack de c0unt0 ? Te laisse pas intimider par Glop et tuo, de toute façon ils ont pas de solution propre à ton problème alors essaye !

Sinon je te propose un truc encore vachement plus vilain mais qui devrait peut-être te permettre d’avancer sur ton problème. A condition que tu sois sous gcc.
Alors mon truc à moi ce serait de recompiler la libc en full debug avec des modifs de mon cru dans malloc/free. Ou bien en non-debug et tu printf comme un sauvage.

Si tu es sous Linux: regarde les sources de Valgrind, ca fait ca avec un tas de truc en plus! Sinon ElectricFence marche aussi

Si tu es sous Windows: euh, y’a pas les sources de purify par hazard? Nan, plus serieusement, le coup du hack est heureusement assez standart meme si les compilos font un peu se qu’ils veulent a ce niveau la. Mais comme c’est plus simple de garder la taille dans le mot d’avant, la plupart font ca. Sinon, je me demandes bien comment ils gerent les delete[] les compilos…