¿Por qué debería declarar el tamaño de un parámetro de matriz C en un encabezado de función?

¿Puede alguien explicarme por qué debería molestarme en especificar el tamaño de un argumento de matriz C en el encabezado de una función? Por ejemplo:

void foo (int iz[6]) { iz[42] = 43; } 

Con:

 int is[2] = {1,2,3}; 

Obtenemos un error útil. Tal vez ayuda con comentarios / documentación?

¿Puede alguien explicarme por qué debería molestarme en especificar el tamaño de un argumento de matriz C en el encabezado de una función? Por ejemplo:

void foo (const char sz [6]) {sz [42] = 43; }

OMI, no deberías. Cuando intenta pasar una matriz a una función, lo que realmente se pasa es un puntero al principio de la matriz. Dado que lo que la función recibe será un puntero, es mejor escribirlo para hacerlo explícito:

 void foo(char const *sz) 

Entonces, ya que ahora está claro que a la función no se le ha dado ninguna pista del tamaño, agregue eso como un parámetro separado:

 void foo(char const *sz, size_t size) 

La única razón significativa para hacerlo es con fines de documentación: para informar a los futuros usuarios que las funciones esperan recibir una matriz de al menos la misma cantidad de elementos. Pero incluso eso es una cuestión de convención, algo que tiene que acordar con otros usuarios de antemano. El lenguaje (el comstackdor) ignora ese tamaño de todos modos. Su statement de función es equivalente a void foo(int iz[]) y a void foo(int *iz) .

La única manera de hacerlo un tanto significativo para el comstackdor es declararlo como

 void foo (int iz[static 6]) 

que actúa como una promesa para el comstackdor de que la matriz tendrá al menos 6 elementos, lo que significa que el comstackdor podrá optimizar ese código usando esa suposición. Además, si realmente desea adoptar la convención mencionada anteriormente, tiene más sentido declarar los tamaños de los parámetros de la matriz específicamente con static , ya que el lenguaje define explícitamente la semántica de esta construcción.

Lo que quiere decir con “obtenemos un error útil” no está claro para mí. El código

 int is[2] = {1,2,3}; is[42] = 42; 

no contiene ninguna violación de restricciones. Produce un comportamiento indefinido, pero no se requiere que produzca un mensaje de diagnóstico durante la comstackción. En otras palabras, no, no obtenemos ningún “error útil” de esto.

Es un comentario Las matrices se degradan a punteros en los parámetros de función. Sin embargo, los comentarios pueden ser útiles, incluso si el comstackdor no los lee.

Es un comentario útil cuando quiere decirle al código del cliente que debe pasar una matriz de tamaño definido , es decir:

 void foo(const char bar[5]); /* It is expected that foo function receives an array of size 5 */ 

Sin embargo, la documentación no reemplaza en las verificaciones de código

 void foo(const char bar[5]) { if (!bar) error(); if (strlen(bar) != 4) error(); /* ... */ }