2012-01-02 8 views
6

Por varias razones, tengo algunas estructuras que quiero forzar a tamaños específicos (en este caso 64 bytes y 512 bytes). Sin embargo, ambos están por debajo de los tamaños que quiero que sean.Tamaño de estructura específica de la fuerza en C

¿Hay alguna forma de que le diga al compilador que los ajuste a estos tamaños específicos y que incluya ceros, o sería mejor simplemente declarar una matriz dentro de la estructura que forma el espacio sobrante para que se alinee en el el tamaño que quiero?

+5

¿Cuáles son las razones? Puede haber otra manera de resolver el problema. –

+0

usando uniones con una variedad de caracteres te viene a la mente ... – amit

+0

Podrías probar algún tipo de truco con '#pragma pack', pero no sé qué tan útil será. – Polynomial

Respuesta

17

Usted puede utilizar una unión.

struct mystruct_s { 
    ... /* who knows how long */ 
}; 

typedef union { 
    struct mystruct_s s; 
    unsigned char padding[512]; 
} mystruct; 

Esto asegurará que la unión sea de 512 bytes o más. A continuación, puede asegurarse de que no tiene más de 512 bytes utilizando una afirmación estática en algún lugar de su código:

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

Si está utilizando C11, hay una forma mejor de hacer esto. No conozco a nadie que use C11 todavía. El estándar fue publicado hace unas semanas.

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

Tenga en cuenta que la única forma de almohadilla con ceros es poner los ceros no manualmente (calloc o memset). El compilador ignora los bytes de relleno.

+0

Me gusta esto, gracias! – themaestro

0

No creo que haya ninguna manera de automatizar esto, al menos en gcc que es el compilador que uso. Tienes que rellenar tus estructuras.

Tenga cuidado con automatic alignment de variables en su estructura. Por ejemplo struct example { char a; int b; }

no toma 5 bytes, pero 8.