OVH Cloud OVH Cloud

Contiguité des structures

15 réponses
Avatar
svinot
Bonjour,

Je suis en train de mettre à jour un programme qui utilise des
structures contenant plusieurs tableaux de char. Il utilise par la
suite ces tableaux "comme s'ils se suivaient". C'est à dire comme si
le dernier caractère de premier tableau est immédiatement suivi en
mémoire par le premier caractère du second tableau.

Esce toujours vérifié ou non ? Sur mon IBM (unix) il semble que cela
soit correct mais je m'intérroge. Merci si vous avez des contres
exemples,

Sébastien

10 réponses

1 2
Avatar
Marc Boyer
Sebastien wrote:
Bonjour,

Je suis en train de mettre à jour un programme qui utilise des
structures contenant plusieurs tableaux de char. Il utilise par la
suite ces tableaux "comme s'ils se suivaient". C'est à dire comme si
le dernier caractère de premier tableau est immédiatement suivi en
mémoire par le premier caractère du second tableau.

Esce toujours vérifié ou non ?


Pas à ma connaissance.

Sur mon IBM (unix) il semble que cela
soit correct mais je m'intérroge. Merci si vous avez des contres
exemples,


Je n'arrive pas à faire de contre exemple, mais à moins de
trouver le bout de norme qui dit que c'est le cas, il serait
utile de faire un truc genre
assert( sizeof(ta structure) == la somme des tailles des tableau)
(d'ailleurs, ça peut être utile même si c'est dans la norme,
juste histoire de vérifier que le compilo est conforme)

Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(

Avatar
Richard Delorme

Bonjour,

Je suis en train de mettre à jour un programme qui utilise des
structures contenant plusieurs tableaux de char. Il utilise par la
suite ces tableaux "comme s'ils se suivaient". C'est à dire comme si
le dernier caractère de premier tableau est immédiatement suivi en
mémoire par le premier caractère du second tableau.

Esce toujours vérifié ou non ?


Réponse courte : Non.

6.7.2.1 Structure and union specifiers

[#12] [...] There may be
unnamed padding within a structure object, but not at its
beginning.

--
Richard

Avatar
Sebastien
"Richard Delorme" a écrit dans le message news:
3f27e2e4$0$9629$

Bonjour,

Je suis en train de mettre à jour un programme qui utilise des
structures contenant plusieurs tableaux de char. Il utilise par la
suite ces tableaux "comme s'ils se suivaient". C'est à dire comme si
le dernier caractère de premier tableau est immédiatement suivi en
mémoire par le premier caractère du second tableau.

Esce toujours vérifié ou non ?


Réponse courte : Non.

6.7.2.1 Structure and union specifiers

[#12] [...] There may be
unnamed padding within a structure object, but not at its
beginning.

--
Richard


Ok, merci c'est clair.

Sébastien


Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', (Sebastien) wrote:

Je suis en train de mettre à jour un programme qui utilise des
structures contenant plusieurs tableaux de char. Il utilise par la
suite ces tableaux "comme s'ils se suivaient". C'est à dire comme si
le dernier caractère de premier tableau est immédiatement suivi en
mémoire par le premier caractère du second tableau.


Pur hasard.

Esce toujours vérifié ou non ?


Non. Il peut y avoir des contraintes d'alignement qui induisent du padding.

Sur mon IBM (unix) il semble que cela
soit correct mais je m'intérroge. Merci si vous avez des contres
exemples,


Plein en 68000 et Power PC! Même en x86 mode protégé, ça doit se trouver

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Tobias Oed
Emmanuel Delahaye wrote:

In 'fr.comp.lang.c', (Sebastien) wrote:

Je suis en train de mettre à jour un programme qui utilise des
structures contenant plusieurs tableaux de char. Il utilise par la
suite ces tableaux "comme s'ils se suivaient". C'est à dire comme si
le dernier caractère de premier tableau est immédiatement suivi en
mémoire par le premier caractère du second tableau.


Pur hasard.

Esce toujours vérifié ou non ?


Non. Il peut y avoir des contraintes d'alignement qui induisent du
padding.

Sur mon IBM (unix) il semble que cela
soit correct mais je m'intérroge. Merci si vous avez des contres
exemples,


Plein en 68000 et Power PC! Même en x86 mode protégé, ça doit se trouver


Le standard le permet mais pour des tableaux de chars je ne vois pas
pourquoi il y aurait du padding sur ces architectures. En particulier sur
les 68000 (le seul sur lequel j'ai fait de l'asm). J'ai pas de compilo pour
mais par curiosite, peut tu faire tourner ca:

#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>

struct foo{
char a[3];
char b[5];
};

int main(void){

printf("%un",offsetof(struct foo,b));

return 0;
}

Chez moi (x86) c'est 3.
Tobias.

--
unix http://www.faqs.org/faqs/by-newsgroup/comp/comp.unix.programmer.html
clc http://www.eskimo.com/~scs/C-faq/top.html
fclc (french): http://www.isty-info.uvsq.fr/~rumeau/fclc/


Avatar
Éric Lévénez
Le 30/07/03 20:26, dans <bg92k0$m8j4u$,
« Tobias Oed » a écrit :

Le standard le permet mais pour des tableaux de chars je ne vois pas
pourquoi il y aurait du padding sur ces architectures. En particulier sur
les 68000 (le seul sur lequel j'ai fait de l'asm). J'ai pas de compilo pour
mais par curiosite, peut tu faire tourner ca:

#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>

struct foo{
char a[3];
char b[5];
};

int main(void){

printf("%un",offsetof(struct foo,b));

return 0;
}

Chez moi (x86) c'est 3.


Sur PowerPC G3/G4, c'est aussi 3.

--
Éric Lévénez -- <http://www.levenez.com>
Unix is not only an OS, it's a way of life.

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', Tobias Oed wrote:

Non. Il peut y avoir des contraintes d'alignement qui induisent du
padding.

Le standard le permet mais pour des tableaux de chars je ne vois pas

pourquoi il y aurait du padding sur ces architectures. En particulier
sur les 68000 (le seul sur lequel j'ai fait de l'asm). J'ai pas de
compilo pour mais par curiosite, peut tu faire tourner ca:

#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>

struct foo{
char a[3];
char b[5];
};

int main(void){

printf("%un",offsetof(struct foo,b));

return 0;
}

Chez moi (x86) c'est 3.


Pareil chez moi en 16 ou 32 bits avec différentes optins d'alignement.

Il y a des rigolos qui s'amusent parfois à faire des cast de la mort genre:

struct foo foo;

int *p = (int*) &foo.b;

*p = 1234; En 68k, BOUM!

Pour éviter ça, il se peut qu'il y ait une option de compilation qui
garantisse que tous les éléments soient alignés correctement (comme les
adresses retournées par malloc()).

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/


Avatar
Sebastien
"Tobias Oed" a écrit dans le message news:
bg92k0$m8j4u$
Emmanuel Delahaye wrote:

In 'fr.comp.lang.c', (Sebastien) wrote:

Je suis en train de mettre à jour un programme qui utilise des
structures contenant plusieurs tableaux de char. Il utilise par la
suite ces tableaux "comme s'ils se suivaient". C'est à dire comme si
le dernier caractère de premier tableau est immédiatement suivi en
mémoire par le premier caractère du second tableau.


Pur hasard.

Esce toujours vérifié ou non ?


Non. Il peut y avoir des contraintes d'alignement qui induisent du
padding.

Sur mon IBM (unix) il semble que cela
soit correct mais je m'intérroge. Merci si vous avez des contres
exemples,


Plein en 68000 et Power PC! Même en x86 mode protégé, ça doit se trouver


Le standard le permet mais pour des tableaux de chars je ne vois pas
pourquoi il y aurait du padding sur ces architectures. En particulier sur
les 68000 (le seul sur lequel j'ai fait de l'asm). J'ai pas de compilo
pour

mais par curiosite, peut tu faire tourner ca:

#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>

struct foo{
char a[3];
char b[5];
};

int main(void){

printf("%un",offsetof(struct foo,b));

return 0;
}

Chez moi (x86) c'est 3.
Tobias.

--
unix http://www.faqs.org/faqs/by-newsgroup/comp/comp.unix.programmer.html
clc http://www.eskimo.com/~scs/C-faq/top.html
fclc (french): http://www.isty-info.uvsq.fr/~rumeau/fclc/



J'ai fait tourné ton prog et j'obtiens effectivement aussi 3. Je me demande
donc si on peut "raisonnablement" supposer que c'est toujours le cas
(lorsque la structure ne contient que des tableaux de char).

Sébastien.



Avatar
Sebastien
"Antoine Leca" a écrit dans le message news:
bgak9s$o9l$
[Je n'ai pas l'original, je répond sur la réponse]

In 'fr.comp.lang.c', (Sebastien) wrote:

Je suis en train de mettre à jour un programme qui utilise des
structures contenant plusieurs tableaux de char. Il utilise par la
suite ces tableaux "comme s'ils se suivaient".



Si tu veux que cela marche, oublie les structures, et alloue
les tableaux (de caractères, pas d'autre chose) les uns à la
suite des autres.
Ça, c'est garanti OK en C.


Antoine



Je suis tout à fait d'accord avec toi, sauf que je ne fait qu'apporter une
modification à des sources existant, et faire cela impliquerait une
modification longue et fastidieuse.D'autant que pour le moment cela
fonctionne et que je n'ai pas le temps de procéder à cet ajustement (dans un
premier temps en tout cas).

Sébastien



Avatar
Stephane Legras-Decussy
"Sebastien" a écrit dans le message news:
bgal24$9rk$
Si tu veux que cela marche, oublie les structures, et alloue
les tableaux (de caractères, pas d'autre chose) les uns à la
suite des autres.
Ça, c'est garanti OK en C.



ah bon ?

tu as le passage de la norme qui dit ça ?


1 2