logo Homepage
+  NewbieContest
|-+  Programmation» Langages compilés» [C] Problème de structure
Username:
Password:
Pages: [1]
  Imprimer  
Auteur Fil de discussion: [C] Problème de structure  (Lu 2805 fois)
Ge0

Profil challenge

Classement : 16/54287

Membre Senior
****
Hors ligne Hors ligne
Messages: 377


Voir le profil WWW
« le: 19 Janvier 2009 à 10:27:31 »

Salut, salut.
J'ai un petit problème avec les structures en C.

Tout d'abord, voici le petit code sur lequel je travaille :
Code:
#include <stdio.h>
#include <stdlib.h>

typedef struct {
    short foo1; // 2 octets
    long foo2; // 4 octets
} MaStructure;

int main() {
    printf("%d octets.\n", sizeof(MaStructure));
    return EXIT_SUCCESS;
}


Normalement, le programme devrait m'afficher "6 octets." ; il m'en affiche 8. Comment cela se fait-il que la taille de la structure soit considérée à 8 octets ? Comment faire pour qu'elle en fasse 6 tout bonnement ?

Pour information, j'ai compilé la source avec CodeBlocks sous WinXP, ainsi que GCC sous Ubuntu 8.10 (je ne sais pas la version de son noyau dans son exactitude, mais je ne sais pas si c'est intéressant, ici).
Journalisée
mogg41

Profil challenge

Classement : 449/54287

Membre Senior
****
Hors ligne Hors ligne
Messages: 267

Mogg41 pour vous aider!


Voir le profil
« #1 le: 19 Janvier 2009 à 11:09:06 »

Bonjour Geo.

On recherchant vite fait sur google, je suis tombé sur ça:
* http://www.cppfrance.com/forum/sujet-COMMENT-CONNAITRE-TAILLE-STRUCTURE_1238335.aspx
* http://www.commentcamarche.net/forum/affich-877698-taille-exact-d-une-structure-c-c?Acces=1

Si j'ai bien compris, la taille d'une structure doit être un multiple entier de la taille d'un mot. La taille d'un mot serait variable d'un ordinateur à un autre et dans ton cas elle serait de 4 octets, d'où le 8 octets (2* 4 octets).

N'hésitez pas à me contredire si je me trompe.

Mogg
Journalisée

"Il ne savait pas que c'était impossible alors il l'a fait." Mark Twain
harvey

Profil challenge

Classement : 12/54287

Membre Senior
****
Hors ligne Hors ligne
Messages: 316


Voir le profil WWW
« #2 le: 19 Janvier 2009 à 12:02:55 »

Tu trouveras une réponse un peu plus claire ici:
http://fr.wikipedia.org/wiki/Alignement_de_donn%C3%A9es
(article sur l'alignement de données)
En l'occurence, ta structure doit ressembler à celle-ci:
Code:
typedef struct {
    short foo1; // 2 octets
    short pad_sur_deux_octets;  // permet à foo2 de se placer sur une adresse mémoire multiple de 4
    long foo2; // 4 octets
} MaStructure;
à ceci près que les deux octets d'alignement, rajoutés par le compilateur, n'ont pas de nom. Dans le cas d'une structure plus grande, il est possible que le compilateur la "range" lui-même pour minimiser sa taille en mémoire.
« Dernière édition: 19 Janvier 2009 à 12:06:22 par harvey » Journalisée

L'entropie vient en mangeant.
Ge0

Profil challenge

Classement : 16/54287

Membre Senior
****
Hors ligne Hors ligne
Messages: 377


Voir le profil WWW
« #3 le: 19 Janvier 2009 à 17:44:38 »

Bon, au moins, le message est on ne peut plus clair.
Merci, Harvey et Mogg.
Journalisée
Pages: [1]
  Imprimer  
 
Aller à: