2010-10-05 4 views
11

Comment puis-je obtenir la taille d'un membre dans une structure en C?sizeof un membre struct

struct A 
{ 
     char arr[64]; 
}; 

i besoin de quelque chose comme ça:

sizeof (A :: arr)

grâce

+1

Qu'est-il arrivé lorsque vous avez essayé 'sizeof (A :: arr)'? – pmg

+0

@pmg 'A' n'est pas un type dans C –

+4

C a déclaré" erreur de syntaxe "en réponse à 'sizeof (A :: arr)'. C n'utilise aucun double-point dans sa syntaxe. –

Répondre

35
sizeof(((struct A*)0)->arr); 

En bref, jetai un pointeur NULL à un type de struct A*, mais depuis l'opérande de sizeof n'est pas évalué, ceci est légal et vous permet d'obtenir la taille des membres de la structure sans créer d'instance de la structure. Fondamentalement, nous prétendons qu'une instance existe à l'adresse 0 et peut être utilisée pour la détermination du décalage et sizeof.

Pour plus d'élaborer, lire cet article:

http://www.embedded.com/design/prototyping-and-development/4024941/Learn-a-new-trick-with-the-offsetof--macro

+4

Il existe des macros pour cette construction dans Windows ('RTL_FIELD_SIZE (type, field)' et Linux (' FIELD_SIZE (t, f) '). –

+4

@Michael: Il n'y a pas de raison d'utiliser des macros non portables spécifiques au système lorsque vous pouvez écrire votre propre implémentation portable aussi facilement –

+0

/* Huh, chose intéressante, cela ne fonctionne pas avec le résumé structs/classes */Cela ne fonctionne pas sur les constantes statiques dans la même classe –