2017-01-28 6 views
-2

Hier initialisierte ich a [3]. In der for-Schleife füttere ich den Eingang 100 mal zu a [] und übertrifft die Indizes [3].
Warum gibt es keinen Segmentierungsfehler direkt nach , wenn i gleich 4 ist.
Eingang
1 2 3 4 5 6 7
Ausgabe
Index Value 0 1 1 2 2 3 4 0 5 5 6 6 7 7
Ausgang ist falsch, wenn Index gleich 4 0 gedruckt. Erwartet 4Warum verursacht man keinen Segmentierungsfehler?

+1

Out-of-Bound-Indexierung ist undefiniertes Verhalten. Suchen Sie nach einem nicht definierten Verhaltens- und Segmentierungsfehler. – P0W

+2

UB bedeutet, dass alles möglich ist, es muss kein Segmentfehler verursacht werden. – songyuanyao

+0

Angenommen, ich initiiere a [33] = 120 & drucke a [33], es druckt 120. Wo genau ist das ein [33] im Speicher? – Sparrow

Antwort

1

Leider C-und C++ - Programme für den Debugging-Programmierer normalerweise nicht segfault, wenn Sie über das Ende eines Arrays schreiben. Stattdessen wird es normalerweise stillschweigend über die Zeigerarithmetik schreiben, bis - wenn das Betriebssystem es erlaubt. Dies überschreibt häufig andere Variablen oder sogar Programmcode, was zu verwirrenden und unvorhersehbaren Fehlern führt.

Ich habe das Wort "normalerweise" hier verwendet, weil nach den Standards das "undefined Verhalten" ist - das heißt, der Compiler und die Laufzeit können alles tun, was sie wollen.

Bei der Entwicklung und beim Testen kann es sehr nützlich sein, eine Bibliothek wie electricfence zu verwenden, die zusätzliche Überprüfungen in Speicheroperationen einführt und Ihr Programm so ausfallen lässt, wie Sie es erwarten.

Verwandte Themen