¿Por qué preferir sizeof (elemento) sobre sizeof (TYPE) para calcular el número de elementos en una matriz?

15

Estoy leyendo "Programación C de King KN" y encontré la siguiente declaración:

Discutimos el uso de la expresión sizeof(a)/sizeof(a[0])para calcular el número de elementos en una matriz. La expresión sizeof(a)/sizeof(t), donde t es el tipo de elementos de a, también funcionaría, pero se considera una técnica inferior.

¿Por qué se considera una técnica inferior?

Higgs
fuente
8
¿consideró qué pasaría si el programador cambia el tipo de elementos en a? a un tipo que tiene un tamaño diferente que t. La primera expresión seguirá estando bien, mientras que la segunda se romperá
mosquito
1
@gnat: Deberías hacer eso una respuesta.
Martin York

Respuestas:

26

sizeof(a)/sizeof(t)codifica explícitamente el tipo en la expresión. Ahora tiene el tipo especificado en varias ubicaciones, sin compatibilidad con el compilador para asegurarse de que está utilizando el mismo tipo. Entonces, si cambia el tipo base de la matriz, pero no en la expresión de recuento (completamente separada), bingo: su código se compilará bien, pero su recuento de elementos será incorrecto. Si tiene suerte, su programa se bloqueará, pero si no, funcionará casi completamente correctamente, pero de vez en cuando se comportará de manera totalmente extraña.

sizeof(a)/sizeof(a[0])se garantiza que es correcto, solo requiere el nombre de la matriz. Cambia el tipo y estás bien; cambie el nombre de la matriz y el compilador se quejará. No se requiere pensar: nos gusta ese tipo de programación.

Daniel Griscom
fuente
Bueno, realmente prefiero sizeof a/sizeof*a, aunque en realidad no es una diferencia sustancial.
Deduplicador