En C, les structures sont disposées presque exactement comme vous le spécifier dans le code. Similaire à C#'s StructLayout.Séquentielle.
La seule différence est membre de l'alignement. Jamais cela ne réordonne les membres de données dans une structure, mais vous pouvez modifier la taille de la structure par insertion de "pad" octets dans le milieu de la structure. La raison pour cela est de s'assurer que chacun des membres commence sur une limite (généralement 4 ou 8 octets).
Par exemple:
struct mystruct {
int a;
short int b;
char c;
};
La taille de cette structure sera généralement de 12 octets (4 pour chaque membre). C'est parce que la plupart des compilateurs, par défaut, chaque membre de la même taille que le plus important dans la structure. De sorte que le char va prendre jusqu'à 4 octets au lieu d'un. Mais il est très important de noter que sizeof(mystruct::c) sera toujours de 1, mais sizeof(mystruct) sera de 12.
Il peut être difficile de prévoir comment la structure sera rembourré/aligné par le compilateur. La plupart seront par défaut comme je l'ai expliqué ci-dessus, certains sera, par défaut, pas de rembourrage/alignement (parfois également appelé "paniers").
La méthode pour modifier ce comportement est très dépendant du compilateur, il n'y a rien dans le langage de spécification de la manière dont cela doit être traitée. Dans MSVC vous utilisez #pragma pack(1)
pour désactiver l'alignement (le 1 dit aligner tout sur 1 les limites d'octets). DANS GCC, vous utiliserez __attribute__((packed))
dans la définition de la structure. Consultez la documentation de votre compilateur pour voir ce qu'il fait par défaut et comment changer ce comportement.