array di lunghezza zero non sono ammessi in C. staticamente tipizzati array devono avere un diverso da zero dimensione fissa, che è un'espressione costante, e della lunghezza della variabile array devono avere una dimensione che valuta diverso da zero; C11 6.7.6.2/5:
ogni volta che [l'espressione size] viene valutata esso ha un valore maggiore di zero
Tuttavia, C99 e C11 ha una nozione di una matrice flessibile membro di una struttura:
struct foo
{
int a;
int data[];
};
Da C11, 6.7.21/18:
Come caso speciale, l'ultimo elemento di una struttura con più di un membro nominato può avere un tipo di array incompleto; questo è chiamato membro dell'array flessibile. Nella maggior parte delle situazioni, il membro di array flessibile viene ignorato. In particolare, la dimensione della struttura è come se il membro della matrice flessibile fosse omesso, eccetto per il fatto che potrebbe avere un riempimento più lungo rispetto a che l'omissione implicherebbe. Tuttavia, quando un operatore .
(o ->
) ha un operando a sinistra che è (un puntatore a) una struttura con un membro di matrice flessibile e l'operando destro chiama membro , si comporta come se quel membro fosse sostituito con l'array più lungo (con lo stesso tipo di elemento ) che non renderebbe la struttura più grande dell'oggetto a cui si accede;
fonte
2013-07-09 22:40:19
Questo non dovrebbe nemmeno essere compilato, visto che 'i' non è costante in fase di compilazione. – Jashaszun
prova a compilarlo; gcc uscirà fuori, ti prenderà a pugni, ti sparerà e ti ruberà la macchina. –
[Ragazzi ...questo è C99 ... non C89.] (http://ideone.com/NKtfJD) – Cornstalks