Dichiarare una matrice di lunghezza negativa

Cosa succede in C quando crei un array di lunghezza negativa?

Per esempio:

int n = -35; int testArray[n]; for(int i = 0; i < 10; i++) testArray[i]=i+1; 

Questo codice verrà compilato (e non richiama avvisi con -Wall abilitato) e sembra che tu possa assegnare a testArray[0] senza problemi. Assegnare il passato che dà un errore di istruzione segfault o illegale, e leggere qualsiasi cosa dall’array dice “Abort trap” (non ho familiarità con quello). Mi rendo conto che questo è un po ‘accademico, e (si spera) non verrebbe mai nella vita reale, ma esiste un modo particolare in cui lo standard C dice di trattare tali array, o varia dal compilatore al compilatore?

È un comportamento indefinito, perché rompe un vincolo “deve”:

C99 §6.7.5.2:

Se la dimensione è un’espressione che non è un’espressione costante intera … … ogni volta che viene valutata deve avere un valore maggiore di zero.

Comportamento indefinito, credo, anche se non lo cito su questo.

Questo dà l’errore error: size of array 'testArray' is negative in gcc:

 int testArray[-35]; 

però, come hai visto:

 int n = -35; int testArray[n]; 

non dà un errore nemmeno con -Wall e -W.

Tuttavia, se si utilizza il flag -pedantic, gcc avviserà che ISO C90 proibisce l’array di lunghezza variabile.

Messaggio erro di Visual Studio per la compilazione , puoi usare -1 per dire una matrice vuota. Si aspetta int e stai passando int, quindi nessun errore del compilatore.