A primeira declaração informa ao compilador que someArray
possui pelo menos 100 elementos. Isso pode ser usado para otimizações. Por exemplo, também significa que someArray
nunca é NULL
.
Observe que o padrão C não exige que o compilador diagnostique quando uma chamada para a função não atende a esses requisitos (ou seja, é um comportamento indefinido silencioso).
A segunda declaração simplesmente declara someArray
(e não someArray
os elementos!) Como const, ou seja, você não pode escrever someArray=someOtherArray
. É o mesmo que se o parâmetro fosse char * const someArray
.
Essa sintaxe é utilizável apenas no interior []
de um declarador de matriz em uma lista de parâmetros de função; não faria sentido em outros contextos.
O texto padrão, que abrange os dois casos acima, está em C11 6.7.6.3/7 (era 6.7.5.3/7 em C99):
Uma declaração de um parâmetro como '' matriz do tipo '' deve ser ajustada para '' ponteiro qualificado para o tipo '', onde os qualificadores de tipo (se houver) são aqueles especificados na derivação do tipo [
e ]
na matriz. Se a palavra-chave static também aparecer dentro da derivação do tipo [
e ]
da matriz, para cada chamada para a função, o valor do argumento real correspondente fornecerá acesso ao primeiro elemento de uma matriz com pelo menos tantos elementos, conforme especificado pelo expressão de tamanho.
int foo(struct bar [static 1]);
vez deint foo(struct bar *);
como a assinatura para funções que não aceitam ponteiros NULL. (Eu sei gcc tem uma sintaxe diferente do padrão alternativo para sinalizar tais funções para que o compilador pode dar avisos ..)