2012-03-25 5 views
6

programmazione la mia scheda del microcontroller arduino in C, ho notato uno strano comportamento.L'array [-1] fornisce l'ultimo elemento nell'array?

A causa di un errore logico nel mio programma, il controllore ha effettuato l'accesso all'elemento -1 di un array intero.

int array[5]; 

array[4] = 27; 
// array[-1] gives 27 now. 

È vero che ho l'ultimo elemento di un array, utilizzando -1 come selettore elemento?

+0

Potrebbe essere che, a causa dello stesso errore logico, è stato prima * scritto * in quella posizione e poi si è letto ciò che ci si aspettava da esso? – Irfy

+0

@Irfy So cosa pensi ma non è il caso. – danijar

risposta

13

No, l'accesso a elementi esterni all'intervallo di indice non è definito. Nel tuo caso, l'elemento all'indirizzo appena prima dell'inizio dell'array è impostato su 27.

Poiché l'accesso agli elementi di matrice in C non è altro che eseguire aritmetica puntatore "diretto", il passaggio degli indici negativi non è vietato. È possibile costruire un caso d'uso legittimo in cui gli indici sono negativi e positivi:

int raw[21], *data = &raw[10]; 
for (int i = -10 ; i <= 10 ; i++) { 
    data[i] = i; 
} 
+0

Ho eseguito il programma ma non si è bloccato. Capisco che l'operazione aritmetica sta avendo luogo. è sorprendente che il compilatore gcc non si lamenta come errore né dà alcun avvertimento. Sai perché è così? –

6

No; array[-1] non accederà all'ultimo elemento. È più probabile che la posizione di memoria appena prima che l'array abbia memorizzato 27. Prova questo:

array[4] = 27; 
array[-1] = 0; 

Poi verificare se array[-1] == array[4]. Non saranno uguali (supponendo che il programma non si arresti in modo anomalo quando si assegna a array[-1]).

1

No, non è corretto secondo lo standard. L'accesso a un elemento all'esterno della matrice richiama il comportamento non definito.

L'implementazione potrebbe (ne dubito!) Fornire tale funzionalità; ma dovresti davvero fare il non su.

2

L'accesso agli array con indice fuori limite non arresta sempre il programma. Se la memoria a cui si accede da -1 è sotto il controllo del programma, verrà fuori un valore non definito (che è stato memorizzato da altri dati creati dal programma). Nel tuo caso è una semplice coincidenza.

-4

Se ci si riferisce a C (e si è), quindi no. Se si tenta di accedere a un array con un indice negativo, si otterrà un'eccezione fuori dai limiti. Tuttavia, Lua implementa questa cosa esatta come una caratteristica. Se accedi a un array Lua con un indice di -1, leggerà l'ultimo elemento dell'array. Un indice di -2 leggerà il penultimo elemento e così via.

Nota a margine: si può infastidire i vostri colleghi, scrivendo questo

foo = {1,2,3,4,5,6,7,8,9,0} 
print(foo.length() * -1]) 

Questo stampa 1. Fastidioso, non è vero.

Problemi correlati