Des octets magiques ???

Fermé
Vincent - 16 janv. 2004 à 13:56
Marden Messages postés 1072 Date d'inscription dimanche 11 février 2001 Statut Membre Dernière intervention 29 janvier 2006 - 16 janv. 2004 à 17:32
Bonjour,
quand on met des double et des int dans une structure, la structure à 4 octets de trop, POURQUOI ça fait ça ??? (du coup on ne peut pas utiliser fread avec une structure, c embêtant...)
Merci beaucoup d'avance à celui qui pourra m'expliquer !

#include <ansi_c.h>
#include <userint.h>

typedef struct
{
    int    champ1;
    double champ2;
} t_struct;

int main(void)
{
    t_struct var1;
    unsigned int na, nb, ns, nsa, nsb;
    int      a=1;
    double   b=2.3;
    
    var1.champ1 = a;
    var1.champ2 = b;
    
    na = (unsigned int) sizeof(a);
    nb = (unsigned int) sizeof(b);
    ns = (unsigned int) sizeof(var1);
    nsa = (unsigned int) sizeof(var1.champ1);
    nsb = (unsigned int) sizeof(var1.champ2);
    
    printf("taille de a = %d octets\n",na);
    printf("taille de b = %d octets\n",nb);
    printf("taille de var1.champ1 (= a) = %d octets\n",nsa);
    printf("taille de var1.champ2 (= b) = %d octets\n",nsb);
    printf("taille de var1 = %d octets\n",ns);
    printf("D'ou viennent ces 4 octets ?!!!\n"); 
    MessagePopup ("", "OK");
}

1 réponse

Marden Messages postés 1072 Date d'inscription dimanche 11 février 2001 Statut Membre Dernière intervention 29 janvier 2006 208
16 janv. 2004 à 17:32
Bonsoir Vincent,

Une partie du problème vient du choix d'implémentation des membres d'une structure, consistant à respecter "l'alignement" sur une frontière de "double", pour faciliter les problèmes d'adressage et de chargement. D'autres constructeurs "savent" manipuler les variables, quelque soit leur type, à des adresses quelconques.
Il aurait été bien que tu nous donnes les résultats ...
Un moyen de vérifier tes dires serait d'éditer les adresses de la structure et de chacun des membres, et même de déclarer un tableau de 2 structures, pour noter l'écart entre leurs adresses (logiquement égal à la taille).
0