[C] Connaitre la taille d'un buffer

Connaitre la taille d'un buffer [C] - C - Programmation

Marsh Posté le 25-01-2006 à 12:15:27    

Salut,  
 
    Voici ma problématique : j'ai un buffer alloué dans une certaine partie du code. Je voudrais connaitre - au moment de le désallouer - sa taille.
 
    J'ai pensé à sizeof(), mais cette fonction ne me retourne pas cette information (d'ailleurs, je me demande ce qu'elle retourne : pour un buffer de "char" de 256 élements, sizeof me renvoie 4 ???).
 
    Comment peut-on procéder ??
 
Merci.

Reply

Marsh Posté le 25-01-2006 à 12:15:27   

Reply

Marsh Posté le 25-01-2006 à 12:21:02    

Si tu as juste un pointeur sur une zone mémoire, tu ne peux pas en connaître la taille.  
 
Et si tu veux en connaître le nombre d'éléments pour la désallocation, j'imagine que c'est ce que tu as : des ** (pointeurs de pointeurs), au minimum.
 
Bref, la taille tu la connais à l'allocation, et il ne faut pas perdre cette valeur.


Message édité par Elmoricq le 25-01-2006 à 12:21:43
Reply

Marsh Posté le 25-01-2006 à 13:04:23    

ClosterHV a écrit :

   Voici ma problématique : j'ai un buffer alloué dans une certaine partie du code. Je voudrais connaitre - au moment de le désallouer - sa taille.


Lorsque un bloc est alloué par malloc(), son adresse est retournée, et, pour des raisons pratiques évidentes (accéder au bloc, le libérer), cette adresse est stockée dans une variable capable de stocker une adresse, c'est à dire un pointeur du bon type (ou void). L'information de taille n'est pas stockée de manière visible (elle est probablement stockée par le système, mais on a aucun moyen standard d'y accéder). La stratégie consiste donc à stocker nous même la taille.
 
Pseudo-code


   size_t n = 123;
   T *p = malloc (sizeof *p * n);


Le couple {taille, adresse} étant inséparable, on a tout intérêt à entériner la chose :  


struct objet
{
   size_t n;
   T *p;
};
 
{
   struct objet mon_objet;
 
   mon_objet.n = 123;
   mon_objet.p = malloc (sizeof *p * mon_objet.n);
}  


On peut aussi encapsuler, rendre la structure anonyme etc. On ne va pas rappeler les 'Bonnes Pratiques' de codage, on les connait...
 
http://mapage.noos.fr/emdel/tad.htm
 

Citation :

   J'ai pensé à sizeof(), mais cette fonction ne me retourne pas cette information (d'ailleurs, je me demande ce qu'elle retourne : pour un buffer de "char" de 256 élements, sizeof me renvoie 4 ???).


C'est la taille en bytes d'une variable pointeur sur ta machine. Cette information ne permet évidemment pas de connaitre la taille de l'objet pointé.
 
http://mapage.noos.fr/emdel/notes.htm#pointeurs


Message édité par Emmanuel Delahaye le 25-01-2006 à 14:59:34

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 25-01-2006 à 14:10:12    

et sizeof n'est pas une fonction mais un operateur, 'sizeof X' est une expression résolu à la compilation et donc constante

Reply

Marsh Posté le 25-01-2006 à 14:43:13    

Merci pour votre aide.

Reply

Sujets relatifs:

Leave a Replay

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