2011-09-09 19 views
6

considere el siguiente fragmento:sizeof() aplicada a la estructura y variables

struct foo { 
    int a; 
    int b; 
    int c; 
}; 

struct foo f; 
printf("%u, %u\n", sizeof(struct foo), sizeof(f)); 

El código devuelve los mismos valores, pero me preguntaba si sizeof() aplicado a la variable es correcto o esto es sólo una coincidencia?

Gracias.

+0

¿Probaste googlear "sizeof applied to variable"? Los primeros dos resultados (uno de los cuales es de StackOverflow) podrían haber respondido a su pregunta. –

+0

Sí, ambas expresiones 'sizeof' devuelven el mismo valor. Tenga en cuenta que el segundo no requiere paréntesis; 'sizeof' es un operador, no una función. Pero '% u' requiere un argumento de tipo' unsigned int', not 'size_t'. Escribe esto: 'printf ("% zu% zu \ n ", sizeof (struct foo), sizeof f);' o esto: 'printf ("% lu% lu \ n ", (unsigned long) sizeof (struct foo) , (unsigned long) sizeof f); '. '% zu' es una característica específica de C99; la migración de 'printf' de su sistema no lo admite. –

Respuesta

6

Ambas devolverán el mismo valor.

De MSDN:

El operador sizeof
El operador sizeof da la cantidad de almacenamiento, en bytes, necesario para almacenar un objeto del tipo del operando. Este operador le permite evitar especificar tamaños de datos dependientes de la máquina en sus programas.

sizeof unary-expression 
sizeof (type-name) 
1

Esto es como se esperaba, es decir, ambos devolverán el mismo valor. Este valor se calcula en tiempo de compilación.

Por lo general, es una buena práctica usar la variable en sizeof ya que más adelante podría cambiar el tipo y, por lo tanto, el tamaño también podría cambiar.

0

En general, es preferible aplicarlo a la variable. Seguirá siendo correcto si el tipo de la variable cambia.

+0

La desventaja de esta manera es que si cambia el tipo de variable de "just struct" a "puntero a struct", sizeof (variable) se convertirá en 4 (u 8 dependiendo de la arquitectura) y el compilador lo aceptará felizmente sin decir nada advertencia. – ivanzoid

5

sizeof obras con tipos y expresiones . Cuando lo aplica a un tipo, el () forma parte de la sintaxis sizeof: sizeof(type). Cuando lo aplica a una expresión () no son parte de la sintaxis sizeof: sizeof expression.

Por lo tanto, su segundo sizeof realmente no se "aplica a una variable". Se aplica a una expresión (f). Esa expresión consiste en una sola variable f encerrada en un par redundante de (). También podría hacerlo sin ese par redundante de () y usar solo sizeof f.

Cuando se aplica sizeof a una expresión, devuelve el tamaño del resultado de la expresión (es decir, el tamaño del tipo que tiene esa expresión). En su ejemplo, se garantiza que ambas aplicaciones de sizeof evalúan con el mismo valor.

De hecho, una buena práctica de programación es evitar el sizeof(type) tanto como sea posible, es decir, prefiera usar sizeof expression. Esto hace que tu código sea más independiente del tipo de letra, lo que siempre es bueno. Los nombres de tipos pertenecen a declaraciones y en ningún otro lugar.