zerowej długości tablice nie są dozwolone C statycznie wpisane macierze muszą mieć, nie-zerową wielkość, która jest stała ekspresja i zmiennej długości macierze muszą mieć rozmiar, który ocenia różną od zera; C11 6.7.6.2/5:
każdym razem [wyrażenie rozmiar] ocenia powinny mieć wartości większej niż zero
Jednakże, C99 i C11 mają pojęcie elastycznej matrycy członek od struct:
struct foo
{
int a;
int data[];
};
od C11, 7.6.21/18:
W szczególnym przypadku ostatni element struktury z więcej niż jednym nazwanym elementem może mieć niekompletny typ tablicy; nazywa się to elastycznym elementem tablicy . W większości sytuacji, elastyczny element tablicy jest ignorowany. W szczególności rozmiar struktury jest taki, jak gdyby pominięto elastyczny człon matrycowy , z tym wyjątkiem, że może on mieć więcej padania z tylną ścianką niż to oznaczałoby pominięcie. Jednak gdy operator .
(lub ->
) ma lewy operand, który jest (wskaźnik na) strukturę z elastycznym elementem macierzy i prawymi argumentami operandowymi, który jest członkiem , zachowuje się tak, jakby ten element był zamieniany na najdłuższy zestaw (z tym samym typem elementu ), który nie powodowałby, że struktura była większa niż obiekt, do którego uzyskiwany był dostęp;
To nie powinno nawet się kompilować, ponieważ 'i' nie jest stałą czasu kompilacji. – Jashaszun
spróbuj skompilować; gcc wyjdzie, uderzy cię, zastrzeli i ukradnie twój samochód. –
[Faceci ...to jest C99 ... nie C89.] (http://ideone.com/NKtfJD) – Cornstalks