Przed przeczytaniem istnieje potrzeba przypomnienia: indeks indeksowy w nawiasach kwadratowych dla nazwy wektora. Wskaźnik ten służy do odwołania się do elementu wektora. Każdy indeks odnosi się do konkretnego elementu (wartości). Liczenie indeksu rozpoczyna się od 0 i kończy się na wektorsize - 1. Tak więc, jeśli wektor ma 10 elementów, pierwszy element jest w indeksie 0, a dziesiąty element jest w indeksie 9. Korzystanie z indeksu 10 w wektorze do odczytu lub zmiany wartości elementu przy indeksie 10, który nie istnieje, powinien wyświetlić komunikat o błędzie poza zasięgiem. Jednak w przypadku kompilatora G ++, o ile wektor został zdefiniowany (pamięć przydzielona dla elementów, nawet jeśli są to elementy domyślne), gdy używany jest indeks poza zakresem, wartość domyślna typu elementu wektora lub innej innej Wartość typu jest zwracana (lub należy się zmienić).
Poza ilustracją z zakresu
Rozważ następującą tabelę:
A | B | C | D | mi | F | G | H | I | J | ||||
-2 | -1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
Pierwszy rząd pokazuje, jak wykonano dziesięć alokacji pamięci dla 10 znaków. Poniżej znaków w tabeli, w drugim rzędzie, znajdują się prawidłowe indeksy (indeksy). Za pomocą indeksu indeksowego -1, -2, -3 itp., powinien spowodować wydanie błędu poza zasięgiem. Korzystanie z indeksu dolnego 10, 11, 12 itp., powinien również spowodować wydanie błędu poza zasięgiem.
W tym artykule ilustruje sytuacje, w których wydawane są błędy poza zasięgiem. Kompilator użyty do próbek kodu w tym artykule jest kompilator G ++ dla Ubuntu. Nie zapomnij dołączyć biblioteki wektorowej do programu dla każdego kompilatora.
Błąd poza zasięgiem dla zdefiniowanego wektora
Zdefiniowany wektor to taki, dla którego przypisano pamięć dla początkowych elementów. Wartości mogą być wartości domyślne lub praktyczne dla typu elementu wektora. Deklarowany wektor bez żadnej formy inicjalizacji nie jest zdefiniowanym wektorem. W przypadku takiego wektora nie ma alokacji pamięci dla żadnego elementu wektora. Taki wektor jest pusty.
Kompilator G ++ dla Ubuntu
Załóżmy, że w wektorze jest dziesięć elementów; Niezbyt rzadki błąd popełniany przez osoby niedoświadczone w programowaniu, jest dostęp do dziesiątego elementu z indeksem dolnym 10. Należy do niego uzyskać dostęp do indeksu indeksowego 9, ponieważ zliczanie indeksu rozpoczyna się od 0. Rozważ następujący program z 10 elementami w wektorze i dostęp do dziesiątego elementu z indeksem 10:
#włączaćTen program z kompilatorem G ++ dla Ubuntu daje wyjście ”, który jest postacią niczego (bez miejsca). Postać niczego jest domyślną postacią dla znaków w C++. Nie ma jedenastego okresu dla tego wektora. Tak więc drugie instrukcja jest instrukcją błędów, która nie jest wykrywana przez kompilator G ++. W przypadku kompilatora G ++ nadal nie jest wykrywany w czasie wykonywania, a program działa błędnie.
Niektóre inne kompilatory
Gdy powyższy program jest używany z niektórymi innymi kompilatorami, instrukcja błędów jest wykrywana w czasie wykonywania, a wyjątek jest wyświetlany z komunikatem o błędzie wydanym na wyjściu. Błąd wciąż nie jest wykrywany w czasie kompilacji.
Rozważ następującą deklarację:
wektorTo może nie wyglądać jak definicja, ale jest to definicja. Istnieje dziesięć lokalizacji pamięci dla dziesięciu elementów wektorowych o domyślnej wartości znaku.
Błąd poza zasięgiem dla nieokreślonego wektora
Deklarowany wektor bez żadnej formy inicjalizacji nie jest zdefiniowanym wektorem. W przypadku takiego wektora nie ma alokacji dla żadnego elementu wektora. Taki wektor jest pusty.
Kompilator G ++ dla Ubuntu
Gdy zadeklarowany wektor nie ma inicjalizacji (lub nie ma wartości domyślnych), użycie indeksu dolnego nie ma zastosowania do wektora w dostępie do jakiegokolwiek elementu wektora, ponieważ nie ma. Nawet indeks zerowy nie może być używany do dostępu do pierwszego elementu, który nie jest obecny. W poniższym programie podjęto próbę dostępu do pierwszego elementu, który nie jest obecny:
#włączaćPierwsza instrukcja w głównej funkcji deklaruje wektor bez miejsca pamięci dla któregokolwiek z jego elementów. To stwierdzenie nie jest definicją. Druga instrukcja próbuje odczytać wartość w indeksie 0. Jest to instrukcja błędów, ponieważ wektor nie ma żadnego elementu, a więc żaden element nie jest obecny na żadnym indeksie zero.
W przypadku kompilatora G ++ program komponuje się z powodzeniem, ale w czasie wykonywania, gdy osiągnięto drugą instrukcję w głównej funkcji, program zatrzymuje się i wydano następujący komunikat o błędzie:
Wadę segmentacji (zrzucone rdzeń)Niektóre inne kompilatory
Wykonanie powyższego programu w innych kompilatorach i zauważanie, że odpowiadające im komunikaty o błędach pozostaje jako ćwiczenie dla czytelnika.
Wniosek
Błąd poza zasięgiem wektora występuje, gdy podjęto próbę dostępu do elementu wektora za pomocą indeksu indeksowego, który jest poza zakresem indeksu. Błąd poza zasięgiem nie jest tym samym jak błąd segmentacji (zrzucony rdzeń).