2010-10-05 12 views
11

¿Cómo puedo obtener el tamaño de un miembro en una estructura en C?sizeof a struct member

struct A 
{ 
     char arr[64]; 
}; 

que necesito algo así:

sizeof (A :: arr)

gracias

+1

¿Qué pasó cuando intentó 'sizeof (A :: arr)'? – pmg

+0

@pmg 'A' no es un tipo en C –

+4

C dijo" error de sintaxis "en respuesta a 'sizeof (A :: arr)'. C no usa dos puntos dobles en ninguna parte de su sintaxis. –

Respuesta

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

En pocas palabras, convertir un puntero nulo en un tipo de struct A*, pero desde el operando sizeof no se evalúa, esto es legal y le permite obtener el tamaño de los miembros de la estructura sin crear una instancia de la estructura.

Básicamente, estamos pretendiendo que existe una instancia de este en la dirección 0 y se puede usar para la determinación de offset y sizeof.

elaborar más, lea este artículo:

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

+4

Existen macros para esta construcción en Windows ('RTL_FIELD_SIZE (tipo, campo)' y Linux (' FIELD_SIZE (t, f) '). –

+4

@Michael: No hay razón para usar macros no-portátiles específicos del sistema cuando puede escribir su propia implementación portátil con la misma facilidad. –

+0

/* Huh, curiosamente esto no funciona con abstract structs/classes */No funciona en constantes estáticas dentro de la misma clase. –