Taille de la structure spécifique à la force en C

Pour diverses raisons, je souhaite imposer certaines structures à des tailles spécifiques (dans ce cas, 64 octets et 512 octets). Cependant, les deux sont en dessous de la taille que je veux.

Est-ce que je peux quand même dire au compilateur de leur atsortingbuer ces tailles et ces chiffres avec des zéros, ou est-il préférable de déclarer simplement un tableau dans la structure qui constitue l’espace en excès afin qu’il s’aligne sur la taille souhaitée?

    Vous pouvez utiliser un syndicat.

     struct mystruct_s { ... /* who knows how long */ }; typedef union { struct mystruct_s s; unsigned char padding[512]; } mystruct; 

    Cela garantira que l’union a une taille de 512 octets ou plus. Ensuite, vous pouvez vous assurer qu’il ne dépasse pas 512 octets en utilisant une assertion statique quelque part dans votre code:

     /* Causes a comstackr error if sizeof(mystruct) != 512 */ char array[sizeof(mystruct) != 512 ? -1 : 1]; 

    Si vous utilisez C11, il existe un meilleur moyen de le faire. Je ne connais personne qui utilise encore le C11. La norme a été publiée il y a quelques semaines.

     _Static_assert(sizeof(mystruct) == 512, "mystruct must be 512 bytes"); 

    Notez que le seul moyen de compléter avec des zéros est d’y placer les zéros manuellement ( calloc ou memset ). Le compilateur ignore les octets de remplissage.

    Je ne pense pas qu’il y ait moyen d’automatiser cela, du moins dans gcc qui est le compilateur que j’utilise Vous devez remplir vos structs.

    Faites attention à l’alignement automatique des variables dans votre structure. Par exemple, struct exemple {char a; int b; }

    ne prend pas 5 octets, mais 8.