For C99, you should use n1256.pdf; that's the most complete version -
it's more complete than the official standard, by reason of including
three Technical Corrigenda.
> direct-declarator ( parameter-type-list )
> parameter-list: parameter-declaration
> parameter-list , parameter-declaration
> parameter-declaration: declaration-specifiers declarator
> declaration-specifiers abstract-declarator
>
> direct-declarator [ static type-qualifier-listopt assignment-expression ]
>
> where The optional type qualifiers and the keyword static shall appear only in a declaration of a function parameter with an array type, and then only in the outermost
> array type derivation and then for each call to the function, the value of the corresponding actual argument shall provide access to the first element of an array with at least as many elements as specified by the size expression.
>
> for example : int func(array[static int i =100) ;
That declaration specifies no type for 'array'. The 'int' is not allowed
in the location where you wrote it - it's a type specifier, not a type
qualifier. In C99, type qualifiers included 'const', 'restrict', and
'volatile'; C2011 adds "_Atomic". Also, your declaration is missing a
terminating ']'.
Here's a corrected example:
int func(int array[static const i=100]);
Such a declaration is equivalent to
i=100;
int func(int * const array);
except for the impact of the 'static' keyword, which I will explain
farther down. Note that the 'const' has become the qualifier of the
'array' variable.
"... the keyword static shall appear only in a declaration of a function
parameter with an array type, and then only in the outermost array type
derivation." (6.7.6.2p1)
"If the keyword static also appears within the [ and ] of the array type
derivation, then for each call to the function, the value of the
corresponding actual argument shall provide access to the first element
of an array with at least as many elements as specified by the size
expression." (6.7.6.3p7)
Therefore, the only defined meaning for that 'static' is to leave
undefined the behavior of calling that function on a array with less
than 100 elements, behavior that would otherwise be well-defined. In
principle, this could allow optimization of the code, by allowing the
compiler to assume that the "shall" is never violated, but off-hand I
can't think of any way to take advantage of that assumption. So what
advantage does using this keyword provide?
The static keyword is intended to be used when writing a function whose
behavior would be undefined anyway, if the array were too small. For
instance, it might contain a statement like the following:
array[99] = 0;
The value of the assignment expression after the 'static' keyword
documents the minimum size of the array, and is intended to encourage
(but not require) implementors to define the behavior when the "shall"
is violated as resulting in the generation of error messages - at
compile time if possible, at run-time if necessary.