La primera declaración le dice al compilador que someArray
tiene al menos 100 elementos de longitud. Esto se puede usar para optimizaciones. Por ejemplo, también significa que someArray
nunca es NULL
.
Tenga en cuenta que el Estándar C no requiere que el compilador diagnostique cuando una llamada a la función no cumple con estos requisitos (es decir, es un comportamiento silencioso indefinido).
La segunda declaración simplemente declara someArray
(¡no someArray
los elementos!) Como constante, es decir, no puede escribir someArray=someOtherArray
. Es lo mismo que si el parámetro fuera char * const someArray
.
Esta sintaxis solo se puede utilizar en el interior []
de un declarador de matriz en una lista de parámetros de función; no tendría sentido en otros contextos.
El texto estándar, que cubre los dos casos anteriores, está en C11 6.7.6.3/7 (era 6.7.5.3/7 en C99):
Una declaración de un parámetro como '' matriz de tipo '' se ajustará a '' puntero calificado para escribir '', donde los calificadores de tipo (si los hay) son los especificados dentro [
y ]
de la derivación de tipo de matriz. Si la palabra clave static también aparece dentro de [
y ]
de la derivación del tipo de matriz, entonces, para cada llamada a la función, el valor del argumento real correspondiente proporcionará acceso al primer elemento de una matriz con al menos tantos elementos como especifique el Expresión de tamaño.
int foo(struct bar [static 1]);
lugar deint foo(struct bar *);
como la firma para funciones que no aceptan punteros NULL. (Sé que gcc tiene una sintaxis alternativa no estándar para marcar tales funciones para que el compilador pueda dar advertencias ...)