C ++ wektor dolny z błędu z zakresu

C ++ wektor dolny z błędu z zakresu
Gdy program poza zasięgiem jest wydawany przez program C ++, wówczas indeks dolny używany do dostępu do elementu wektora jest poza zakresem indeksów wektorowych. Zależy to jednak od kompilatora. Z kompilatorem G ++ dla Ubuntu, gdy indeks dolny jest poza zakresem, wartość domyślna lub inna wartość jest zwracana lub rozumiana jako w komórce. Dzieje się tak tylko wtedy, gdy wektor jest już zdefiniowany za pomocą niektórych elementów. Z kompilatorem G ++, gdy wektor jest zadeklarowany bez żadnego elementu, i podjęto próbę dostępu do powiązanej lokalizacji pamięci (bez żadnego elementu), przy użyciu wszelkiej liczby całkowitej indeksowej (nawet 0), kompilator G ++ wydaje błąd: „ Wadę segmentacji (zrzucone rdzeń) ”.

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ć
#włączać
za pomocą przestrzeni nazw Std;
int main ()

vectorvtr = „a”, „b”, „c”, „d”, „e”, „f”, „g”, „h”, „i”, „j”;
char ch = vtr [10]; // instrukcja błędów
Cout<powrót 0;

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ę:

wektor VTR (10);

To 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ć
#włączać
za pomocą przestrzeni nazw Std;
int main ()

VectorVTR;
char ch = vtr [0]; // instrukcja błędów
Cout<powrót 0;

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ń).