Kann ein Zeiger ohne Dereferenzierung noch segfault inkrementieren oder andere (un) definierte Gemeinheiten haben?

8

Alle Beispiele, die ich online finden konnte, um einen Zeiger zu erhöhen, der einen segfault verursacht, beinhaltete die Dereferenzierung des Zeigers - was ist, wenn ich nur inkrementieren möchte (zum Beispiel am Ende einer for-Schleife) und ich Es ist mir egal, ob es in einem ungültigen Speicher landet, weil ich es nicht wieder benutzen werde. Zum Beispiel muss ich in diesem Programm bei jeder Iteration nur um 4 vorrücken, aber diese Zeiger werden nach der letzten Iteration nie wieder dereferenziert.

%Vor%

Muss ich stattdessen so etwas tun?

%Vor%

Gibt es einen besseren Weg, um das zu erreichen, was ich versuche?

Wenn ich es selbst versucht habe, scheint nichts Schlimmes zu passieren, aber das ist kaum eine Garantie, dass es immer funktionieren wird, und leider habe ich keinen Zugang zu Valgrind oder ähnlichem bei der Arbeit.

Wir verwenden den C ++ 11 Standard, fwiw, und ich konnte dort nichts finden, was direkt darauf zutrifft, aber ich werde der Erste sein, der zugibt, dass ich den Standard nicht gut genug kenne um eine gute Vorstellung davon zu haben, wo man danach suchen sollte.

    
Dannnno 08.01.2016, 15:22
quelle

2 Antworten

8

In Abschnitt 5.7, "Additive Operatoren", Absatz 5 wird dies spezifiziert - das Ergebnis der Addition selbst ist nicht definiert; Das Programm ist nicht gültig, auch wenn Sie die Zeiger nie dereferenzieren.

  

Wenn sowohl der Zeigeroperand als auch das Ergebnis auf Elemente des   gleiches Array-Objekt oder hinter dem letzten Element des Array-Objekts   die Bewertung darf keinen Überlauf erzeugen; ansonsten das Verhalten   ist undefiniert.

Es ist höchst unwahrscheinlich, dass es segfault, obwohl es erlaubt ist, aber es ist immer noch undefiniert mit allem was dazu gehört.

    
molbdnilo 08.01.2016, 15:43
quelle
4

Wenn nur das Zuweisen eines ungültigen Verweises zu einem Zeiger ein Problem wäre, wäre auch das Initialisieren von eins auf NULL ein Problem. Die Antwort auf Ihre spezifische Frage lautet also "Nein".

    
Scott Hunter 08.01.2016 15:27
quelle