2012-03-25 11 views
6

programowanie mojej tablicy mikrokontrolera arduino w C, zauważyłem dziwne zachowanie.Czy tablica [-1] podaje ostatni element w tablicy?

Z powodu błędu logicznego w moim programie kontroler uzyskał dostęp do elementu th liczby całkowitej z tablicy -1.

int array[5]; 

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

Czy to prawda, że ​​mogę dostać ostatni element tablicy za pomocą -1 jako selektor elementu?

+0

Czy to możliwe, że z powodu tego samego błędu logicznego, najpierw * zapisałeś * w tej lokalizacji, a następnie przeczytałeś to, czego od niej oczekiwałeś? – Irfy

+0

@Irfy Wiem, o czym myślisz, ale tak nie jest. – danijar

Odpowiedz

13

Nie, uzyskanie dostępu do elementów spoza zakresu indeksu jest niezdefiniowanym zachowaniem. W twoim przypadku element pod adresem tuż przed początkiem twojej tablicy jest ustawiony na 27.

Ponieważ dostęp do elementów tablicy w C jest niczym więcej niż robieniu "prostej" arytmetyki wskaźnika, przekazywanie ujemnych indeksów nie jest zabronione. Można skonstruować uzasadniony przypadek użycia, w którym indeksy są ujemne i dodatnie:

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

Uruchomiłem program, ale nie zawiesił się. Rozumiem, że ma miejsce operacja arytmetyczna. zaskakujące, że kompilator gcc nie narzeka jako błąd ani nie daje żadnego ostrzeżenia. Czy wiesz, dlaczego tak jest? –

6

Nie; array[-1] nie będzie mieć dostępu do ostatniego elementu. Bardziej prawdopodobne jest to, że pamięć znajdująca się tuż przed tablicą jest w niej przechowywana. Wypróbuj to:

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

Następnie sprawdź, czy array[-1] == array[4]. Nie będą równe (zakładając, że program nie ulega awarii podczas przypisywania do array[-1]).

1

Nie, nieprawidłowa zgodnie z normą. Dostęp do elementu poza tablicą powoduje wywołanie Undefined Behavior.

Twoje wdrożenie może (wątpię w to!) Zapewnić tę funkcjonalność; ale naprawdę powinieneś/powinnaś polegać na nie.

2

Uzyskiwanie dostępu do tablic z indeksem poza granicami nie zawsze powoduje awarię programu. Jeśli pamięć dostępna przez -1 znajduje się pod kontrolą programu, wyskoczy nieokreślona wartość (która została zapisana przez inne dane utworzone przez program). W twoim przypadku jest to zwykły zbieg okoliczności.

-4

Jeśli chodzi o C (i jesteś), to nie. Jeśli spróbujesz uzyskać dostęp do tablicy z indeksem ujemnym, otrzymasz wyjątek poza granicami. Jednak Lua implementuje tę dokładną rzecz jako funkcję. Jeśli uzyskasz dostęp do tablicy Lua z indeksem -1, odczyta ona ostatni element tablicy. Indeks -2 odczyta drugi do ostatniego elementu i tak dalej.

marginesie: można drażnić swoich współpracowników pisząc ten

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

ten drukuje 1. irytujące, nie jest to.