IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

problème de sizeof


Sujet :

C

  1. #1
    Membre confirmé Avatar de fomazou
    Inscrit en
    Mars 2004
    Messages
    220
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 220
    Par défaut problème de sizeof
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<conio.h>
     
    typedef struct enteteFichier enteteFichier;
          struct enteteFichier{
             char f1,f2;
             unsigned int sizeFichier;					//La taille totale du fichier en octets 
             unsigned int reserve;						//reservé
             unsigned int BMP_Off;						//offset: adresse de début de l'image
          };
    .
    .
    .
      int main ()
          {
             .
             .
             .
                printf("taille d'entête du fichier  %d \n",sizeof(enteteFichier));
     
          }
    résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    taille d'entête du fichier  16
    au lieu de 14.
    puisque dans ma structure j'ai 2 char-» 2 octets, 3 unsigned int -»3*4=12 et
    12+2=14. donc sizeof(enteteFichier) devrai donner 14, mais j'ai plutôt 16 pourquoi?

  2. #2
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Question de "padding":
    Data Structure Alignment

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 449
    Par défaut
    Voyons où tes membres sont localisés dans ta structure :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stddef.h>
     
    typedef struct enteteFichier enteteFichier;
          struct enteteFichier{
             char f1,f2;
             unsigned int sizeFichier;                  //La taille totale du fichier en octets 
             unsigned int reserve;                      //reservé
             unsigned int BMP_Off;                      //offset: adresse de début de l'image
          };
     
    int main ()
          {
                printf("taille d'entête du fichier  %d \n",sizeof(enteteFichier));
     
     
                printf("f1            : %d\n",offsetof(enteteFichier,f1));
                printf("f2            : %d\n",offsetof(enteteFichier,f2));
                printf("sizeFichier   : %d\n",offsetof(enteteFichier,sizeFichier));
                printf("reserve       : %d\n",offsetof(enteteFichier,reserve));
                printf("BMP_Off       : %d\n",offsetof(enteteFichier,BMP_Off));
          }

    Résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    taille d'entête du fichier  16 
    f1            : 0
    f2            : 1
    sizeFichier   : 4
    reserve       : 8
    BMP_Off       : 12
    Tes caractères sont donc bien empaquetés au début de ta structure, et ton premier entier sur 32 bits est ensuite aligné sur un offset multiple de 4 pour accélérer le traitement. Les autres le sont ensuite automatiquement.

    Il faut demander au compilateur, à l'aide d'options spécifiques, que tu veux tasser les membres de ta structure, si c'est nécessaire. Généralement, c'est #pragma pack.

    http://gcc.gnu.org/onlinedocs/gcc/St...acking-Pragmas

  4. #4
    Membre confirmé Avatar de fomazou
    Inscrit en
    Mars 2004
    Messages
    220
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 220
    Par défaut
    ok je vais essaye d'approfondir sur le sujet. ça marche comme je veux avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #pragma pack(1)
    typedef struct enteteFichier enteteFichier;
          struct enteteFichier{
             char f1,f2;
             unsigned int sizeFichier;				               unsigned int reserve;						 unsigned int BMP_Off;	
    }
    merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème avec sizeof
    Par Porteuris dans le forum Débuter
    Réponses: 14
    Dernier message: 11/12/2008, 10h32
  2. malloc : problème avec sizeof ?
    Par samplaid dans le forum C
    Réponses: 2
    Dernier message: 24/11/2007, 18h24
  3. problème avec sizeof
    Par PIL dans le forum C
    Réponses: 10
    Dernier message: 10/09/2006, 12h12
  4. problème de sizeof() ?
    Par CodeurNé dans le forum Réseau
    Réponses: 5
    Dernier message: 22/08/2006, 15h41
  5. Problème avec sizeof(...) : erreur de taille
    Par Invité dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 06/05/2006, 12h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo