Das Deklarieren von zwei Variablen namens a
ist sicherlich ein Fehler; Wenn dein Compiler das akzeptiert, ist es kaputt. Ich nehme an, Sie meinen, dass Sie immer noch keinen Fehler erhalten, wenn Sie eine Erklärung durch die andere ersetzen.
Array-Zugriff wird nicht bereichsüberprüft. Zum Zeitpunkt der Kompilierung ist die Größe eines Arrays oft nicht bekannt, und die Sprache erfordert auch dann keine Überprüfung. Zur Laufzeit würde eine Überprüfung die Leistung beeinträchtigen, was gegen die C++ - Philosophie, nicht für etwas zu bezahlen, das Sie nicht benötigen, zu gehen. Ein Zugriff über das Ende eines Arrays hinaus gibt ein undefiniertes Verhalten, und es liegt am Programmierer, sicherzustellen, dass dies nicht geschieht.
Manchmal verursacht ein ungültiger Zugriff einen Segmentierungsfehler, aber dies ist nicht garantiert. In der Regel wird der Speicherschutz nur auf ganze Seiten des Speichers mit einer typischen Seitengröße von einigen Kilobyte angewendet. Jeder Zugriff innerhalb einer Seite mit gültigem Speicher wird nicht abgefangen. Es besteht eine gute Chance, dass der Speicher, auf den Sie zugreifen, eine andere Programmvariable oder einen Teil des Aufrufstapels enthält, so dass das Schreiben des Programms das Verhalten des Programms auf fast jede denkbare Weise beeinflussen kann.
Wenn Sie sicher sein möchten, können Sie std::vector
verwenden und nur auf seine Elemente zugreifen, indem Sie die at()
-Funktion verwenden. Dies überprüft den Index und löst eine Ausnahme aus, wenn er außerhalb des Bereichs liegt. Es verwaltet auch die Speicherzuweisung für Sie und behebt das Speicherleck in Ihrem Beispiel.
Leider ist das definierte Verhalten ** manchmal ** eine Untermenge von undefiniertem Verhalten :( – Mahesh
@Mahesh :)) Nein. –
@LuchianGrigore ** Manchmal ** – Mahesh