Meilleure réponse
La séquence exacte sizeof(struct)
est une erreur de compilation en C. Je suppose que vous demandez comment vous déterminez la taille dun particulier struct
.
Cette réponse nest pas fournie directement par la définition du langage C. Il s’agit plutôt d’une fonction de l’ABI de votre architecture cible particulière. (ABI signifie Application Binary Interface.)
Le standard du langage C établit quelques règles générales. Par exemple, si vous avez un struct
avec plusieurs membres, le premier membre partagera une adresse avec le struct
lui-même, et les membres suivants être à des adresses plus élevées.
Les champs de bits ont leur propre ensemble de règles. Je ne vais pas les récapituler ici.
Pour une première commande, la taille dun struct
sera au moins aussi grand que la somme de la taille de ses membres (en ignorant les champs de bits pour le moment). Les membres peuvent avoir des contraintes dalignement, et si cest le cas, lenvironnement peut introduire un remplissage entre les membres et un remplissage à la fin de struct
.
Considérez ce qui suit struct
sur une architecture qui nécessite un alignement sur 8 octets pour les valeurs double
:
struct fun {
char a;
double b;
char c;
};
Par les règles du langage C, b
doit être à une adresse supérieure à a
dans toute instance de struct fun
. De même, c
doit être à une adresse plus élevée que b
.
Par conséquent, cette structure particulière occupe probablement 24 octets, en raison des contraintes dalignement sur b
sur cette architecture. La même structure peut ne nécessiter que 16 octets sur une architecture qui ne nécessite quun alignement de 4 octets pour double
.
Vous ne me croyez pas?
Voyez par vous-même:
En fin de compte, vous devez consulter lABI de votre plate-forme cible pour comprendre comment un struct
est regroupé pour cette cible.
Ou, utilisez simplement sizeof
si vous ne vous en souciez pas personnellement, mais que votre code doit sen soucier.
Réponse
Comment calculer la valeur de sizeof (struct) en C?
Vous navez pas. Le compilateur le fait.
Tout dabord, sizeof(struct)
est une erreur de syntaxe. Vous vous demandez probablement comment déterminer la taille dun type de structure ou dun objet dun tel type. Il est important d’être précis. (Je comprends que la suppression des détails des questions par Quora rend cela difficile.)
Disons que vous avez un type de structure nommé struct foo
et / ou un objet de ce type nommé obj
. La taille du type est sizeof (struct foo)
et la taille de lobjet (qui est la même que la taille de son type) est sizeof foo
. (Les parenthèses sont obligatoires dans le premier cas et non dans le second. Il existe en fait deux formes différentes de lopérateur sizeof
. Lune est appliquée à un nom de type entre parenthèses, lautre à un expression, qui est souvent mais pas toujours un nom dobjet.)
Vous pensez peut-être que vous pouvez calculer la taille dune structure en additionnant les tailles de ses membres. Vous ne pouvez pas. Les compilateurs peuvent insérer et insèrent un remplissage entre les membres, et éventuellement après le dernier membre, pour satisfaire les exigences dalignement. La taille dune structure est au moins la somme des tailles de ses membres, mais si vous avez besoin de la taille de la structure entière, utilisez simplement sizeof
. C’est pour ça que ça sert.