cs_flofloo
Messages postés45Date d'inscriptionsamedi 5 juin 2004StatutMembreDernière intervention16 mars 2009
-
5 déc. 2008 à 12:05
BruNews
Messages postés21041Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019
-
5 déc. 2008 à 18:13
bonjour tout le monde,
auparavant,t je pensait que pour connaitre la taille d'une structure c mentalement il suffisait de sommer la taille de tout les éléments de la structure mais je découvre après avoir lu ce tuto que c'est pas tout le temps le cas :
http://melem.developpez.com/reseaux/rawsockets/ si quelqu'un peux m'aider a comprendre c'est quoi les contraintes d'alignement et comment on calcule mentalement
la taille d'une structure se serais gentil.
merci d'avance pour vos reponse.
fregolo52
Messages postés1115Date d'inscriptionmercredi 15 juin 2011StatutMembreDernière intervention 6 mai 20213 5 déc. 2008 à 15:37
Sommer la taille des éléments d'un structure !!!! Erreur fatale.
Tout dépend comment est configuré le compilo, mais généralement les compilo aligne à 4 ou 8 octets.
Avec l'expérience tu apprendras, t'expliquer est assez difficile il faudrait lister tous les cas.
Si on reprend le totu :
<code class="c_keyword3">struct
s
{
char
c;
/*
1
octet
*/
int
n;
/*
4
octets
*/
}
;
Si ton compilo aligne à 4 : sizeof(s) = 8
</code>
<code class="c_keyword3">struct
s2
{
char
c;
/*
1
octet
*/
</code>
<code class="c_keyword3">char
c2;
/*
1
octet
*/
</code>
<code class="c_keyword3">int
n;
/*
4
octets
*/
}
;
</code>
Si ton compilo aligne à 4 : sizeof(s2) = 8 (aussi)
D'où de grosse surprise si tu as 2 programmes qui n'alignent pas de la même façon.
J'ai eu ce pb avec un programme Windows et l'autre sous Linux.
BruNews
Messages postés21041Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 201919 5 déc. 2008 à 18:13
typedef struct _S {
char c;
short d;
char l;
int ent;
} S;
Exemple avec une struct S commençant à l'adresse 1000:
adresse de S.c : 1000
adresse de S.d : 1002 // multi de 2 !!!
adresse de S.l : 1004
adresse de S.ent : 1008 // multi de 4 !!!
la struct finira bien à l'adresse 1011, donc 12 octets.