2012-01-04 11 views
6

La estructura se define de la siguiente manera¿Cómo funciona la función sizeof() para Estructuras en C?

typedef struct Sample 
{ 
    int test; 
    char strtest; 
} Sample; 

En función principal, llamé Sizeof la estructura.

sizeof(struct Sample) 

He oído que el valor de retorno de sizeof en las estructuras podría ser incorrecto. Si este es el caso, ¿qué debo hacer para obtener el valor correcto?

+1

Con out un typedef en el alcance 'Sample' no es un tipo válido. ¿Estás usando un compilador de C++ para el código C? Sugiero que no hagas eso ... y si 'Sample' es un objeto, los paréntesis son redundantes. – pmg

+0

sizeof no es una función, sino una directiva de compilación. Significa que no se ejecuta el tiempo de ejecución, pero se reemplaza con el valor correspondiente en el momento de la compilación. – Rolice

+0

Nunca es "incorrecto". Solo le falta su comprensión, no el compilador. –

Respuesta

22

Devuelve un valor confiable, pero no siempre el valor esperado.

En la estructura de ejemplo, está asumiendo un byte de 1 byte y 4 byte int, pero no obtiene un resultado de "5".

Porque la estructura está acolchada para que los elementos comiencen en sus límites naturales. tiene más probabilidades de obtener un resultado de "8".

Wiki explica esto bastante bien: http://en.wikipedia.org/wiki/Sizeof - en "Estructura acolchada", cerca de la parte inferior.

+0

@ Karthik: ¿Es independiente de la plataforma? – Karai

+0

No, no es independiente de la plataforma; ni siquiera es necesariamente * compilador * independiente. –

+0

@ Ernest: ¿Puedes explicar tus pensamientos? – Karai

1

Sizeof no es una función; es un operador . Su resultado siempre es correcto, pero a veces inesperado, debido al relleno, o la creencia de que es un determinante de tamaño de matriz mágica.

Como operador, los paréntesis no son necesarios si actúa en una variable.

int foo; 
printf("%zu\n", sizeof foo); 

es perfectamente legal.

+0

debe usar '% zu' con' sizeof', '% d' especificación de conversión con' sizeof' no está definido – ouah

1

sizeof con un tipo de estructura funciona como con cualquier otro tipo: el resultado del operador es el tamaño del tipo en bytes. El tamaño del tipo de estructura es el mismo que el tamaño de un objeto de este tipo de estructura.

sizeof un objeto de estructura puede ser más que el tamaño de los diferentes elementos de los tipos de estructura debido al relleno.

No puede haber acolchado de número no especificado de bytes después de cada miembro de estructura y el relleno se tiene en cuenta en el tamaño del tipo de estructura (o de un objeto del tipo de estructura)

Para imprimir el tamaño de un tipo de estructura utiliza el especificador z la conversión de una cadena printf formato:

printf("%zu\n", sizeof (struct my_structure_type));