question sur les char *

question sur les char * - C++ - Programmation

Marsh Posté le 20-07-2010 à 21:38:58    

bonjour à tous,

 

voila mon problème, ou plutôt ma question, est ce que si on prend un pointeur qui pointe vers une structure, on peut la lire comme une chaine de charactères ? Je m'explique :

 

Par exemple j'ai la structure suivante :

Code :
  1. struct Obj {
  2. public:
  3.         int a;
  4.         char b[3];
  5.         float c;
  6. };
 

Est ce que je peux considérer un pointeur de char* dessus, et espérer retrouver les valeurs des champs ? cad :

Code :
  1. //        13                            3.14f  
  2. //  --------------- 'T' 'H' 'C'  ---------------
  3. // | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10
  4. int main() {
  5.         Obj o;
  6.        //initialisation des champs avec des valeurs
  7.         o.a = 13;
  8.         memcpy(o.b,"THC",sizeof(char)*3);
  9.         o.c = 3.14f; 
  10.         char * p = (char*)&o; //ici un pointeur vers mon objet (avec un cast crado)
  11.         //et là, j'essaie de retrouver les valeurs à partir du pointeur :
  12.         printf("%d\t%c%c%c\n",
  13.                                          *(int*)p,
  14.                                          *(char*)(p+4),*(char*)(p+5),*(char*)(p+6));
  15.         p+=8;
  16.         printf("%f\n",*(float*)p);
  17.         std::cin.get();
  18.         return 0;
  19. }
 

mais, ce que je ne comprend pas, c'est pourquoi pour retrouver ma valeur de float o.c = 3.14f, je suis obligé d'aller à la case huit! pourquoi ce n'est pas la case 7 plutot ? comme sur mon schéma en commentaires...

 

Si vous avez compris et savez pourquoi, merci!! :)


Message édité par in_your_phion le 20-07-2010 à 21:43:00
Reply

Marsh Posté le 20-07-2010 à 21:38:58   

Reply

Marsh Posté le 20-07-2010 à 22:12:16    

les membres des structures sont alignés sur 32/64 bits.
3 char deviennent 4 char etc

Reply

Marsh Posté le 20-07-2010 à 22:14:35    

Joel F a écrit :

les membres des structures sont alignés sur 32/64 bits.
3 char deviennent 4 char etc

 

Arf. Donc si je veux que les données soient consécutives, je n'ai pas d'autre choix que de tout recopier dans un buffer les unes à la suite des autres ?


Message édité par in_your_phion le 20-07-2010 à 22:14:51
Reply

Marsh Posté le 20-07-2010 à 22:36:23    

mets ton char[3] a la fin.

Reply

Marsh Posté le 20-07-2010 à 22:41:03    

Joel F a écrit :

mets ton char[3] a la fin.

 

en fait l'ordre est important  :( je dois d'abord fournir le champ int en premier, ensuite un char[3], etc ... Je suis obligé de copier le tout dans un buffer je crois, non ?


Message édité par in_your_phion le 20-07-2010 à 22:41:13
Reply

Marsh Posté le 20-07-2010 à 22:44:41    

google attribute packed

Reply

Marsh Posté le 20-07-2010 à 22:57:44    

Joel F a écrit :

google attribute packed


 
merci :) mais il faudrait en plus que ma solution soit portable sur tous les Os (sun, linux, sparc, windows, etc) et je ne sais pas si __attribute__((__packed__)) le permet

Reply

Marsh Posté le 21-07-2010 à 06:49:42    

c'est compilo dependant, pas OS dependant.
Sous MSVC ca s'appelle #pragma pack

Reply

Sujets relatifs:

Leave a Replay

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