Partage
  • Partager sur Facebook
  • Partager sur Twitter

probléme concérnant la fonction sizeof()

Anonyme
    24 mars 2018 à 19:42:30

    bonsoir tout le monde , est ce que vous pouvez m'aider svp , je fais ceci

    #define MAX 5
    typedef struct pile pile ;
    struct pile {
    int sommet;
    char tab[MAX];
    }
    int main(){
    pile p ;
    printf("%d",sizeof(p));
    }
    
    


    il me donne 12 au lieu de 9 (taille d int : 4 , d char 1 .. c 5+4*1 normalement)

    -
    Edité par Anonyme 24 mars 2018 à 20:31:10

    • Partager sur Facebook
    • Partager sur Twitter
      24 mars 2018 à 20:15:02

      Bonsoir,

      Change ton titre, après on verra !

      • Partager sur Facebook
      • Partager sur Twitter
        24 mars 2018 à 20:15:53

        Salut,

        Comme c’est urgent, je vais répondre la semaine prochaine. Ou le mois prochain ? Non sérieusement, tu devrais lire les règles du forum et en fait même sans les lire, ce serait bien de dire bonjour.

        • Partager sur Facebook
        • Partager sur Twitter
        Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
        Anonyme
          24 mars 2018 à 20:30:02

          Ok mes amis je vais modifier le post .. je demande pardon je suis débutant ..
          • Partager sur Facebook
          • Partager sur Twitter
            24 mars 2018 à 23:55:52

            Bonsoir ! 'sizeof' n'est pas une fonction mais un opérateur (unaire). La taille totale de la structure n'est pas la somme des tailles de chaque champ, comme tu viens de le constater. C'est un problème assez subtil : les octets sont regroupés. Mettons qu'ils soient regroupés par 4, dans ce cas le premier groupe contient l'entier, un deuxième groupe contient les quatre premiers caractères, et un troisième groupe contient le cinquième caractère ainsi que trois octets vide qui ne sont là que pour du remplissage, mais appartiennent à la structure. Du coup ça fait 12 octets. Cette caractéristique porte un nom, je ne sais plus lequel (si je m'en étais souvenu, j'aurais pu trouver plein d'articles à ce sujet à l'aide d'un moteur de recherche car c'est un sujet classique).

            -
            Edité par robun 25 mars 2018 à 0:30:04

            • Partager sur Facebook
            • Partager sur Twitter
              25 mars 2018 à 0:10:03

              Salut,

              Le mot que robun cherche est le padding.

              De mémoire, dans une structure, le type le plus large défini le multiple minimum. Si tu as un int et un char, alors le int prend ses 4 octets, mais le char aussi dont 3 octets de padding:

              typedef struct s_a
              {
                  char toto, tata;
              }
              Sa;
              
              typedef struct s_b
              {
                  uint32_t toto;
                  char tata;
              }
              Sb;
              
              typedef struct s_c
              {
                  uint64_t toto;
                  char tata;
              }
              Sc;
              
              
              int main(void)
              {
                  printf("sa = %d\n", sizeof(Sa));
                  printf("sb = %d\n", sizeof(Sb));
                  printf("sc = %d\n", sizeof(Sc));
              
                  return 0;
              }


              Il y a une option de compilation pour virer le padding.

              Bonne continuation.

              • Partager sur Facebook
              • Partager sur Twitter

              Bonhomme !! | Jeu de plateforme : Prototype.

              Anonyme
                25 mars 2018 à 0:34:58

                merciii pour votre aide les amis . je suis actuellemnt entrain de lire une article sur le padding
                • Partager sur Facebook
                • Partager sur Twitter
                  26 mars 2018 à 9:10:22

                  En utilisant la directive `pragma pack` tu peux virer le padding. :)

                  #pragma pack(1)
                  
                  typedef struct s_a
                  {
                      char toto, tata;
                  }
                  Sa;
                   
                  typedef struct s_b
                  {
                      uint32_t toto;
                      char tata;
                  }
                  Sb;
                   
                  typedef struct s_c
                  {
                      uint64_t toto;
                      char tata;
                  }
                  Sc;
                   
                   
                  int main(void)
                  {
                      printf("sa = %d\n", sizeof(Sa));
                      printf("sb = %d\n", sizeof(Sb));
                      printf("sc = %d\n", sizeof(Sc));
                   
                      return 0;
                  }
                  sa = 2
                  sb = 5
                  sc = 9



                  • Partager sur Facebook
                  • Partager sur Twitter

                  probléme concérnant la fonction sizeof()

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown