Alle Beispiele, die ich online über das Inkrementieren eines Zeigers finden konnte, der einen segfault verursacht, umfasste die Dereferenzierung des Zeigers - was, wenn ich nur inkrementieren möchte (zum Beispiel am Ende einer for-Schleife) und ich don 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 nur jede Iteration um 4 schreiten, aber ich werde diese Zeiger nach der letzten Iteration nie wieder dereferenzieren.Kann ein Zeiger ohne Dereferenzierung noch segfault inkrementieren oder andere (un) definierte Gemeinheiten haben?
float* leftRowPointer, resultRowPointer;
// assume they were correctly initialized
for (unsigned int i = 0; i < 4; ++i, leftRowPointer += 4, resultRowPointer += 4) {
// do some stuff
}
Muss ich stattdessen so etwas tun?
for (unsigned int i = 0; i < 4; ++i) {
// same stuff
if (i != 3) {
leftRowPointer += 4;
resultRowPointer += 4;
}
}
Gibt es einen besseren Weg, um zu erreichen, was ich versuche zu tun?
Wenn ich es selbst versucht habe, scheint nichts Schlimmes zu passieren, aber das ist kaum eine Garantie, dass es immer funktioniert, 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 als erster zugeben, dass ich den Standard nicht gut kenne genug, um eine gute Vorstellung davon zu haben, wo man danach suchen sollte.
Suchen Sie in additive Operatoren (wahrscheinlich [expr.plus] oder etwas wie §5.5). – chris
Was sind die Typen 'leftRowPointer' und' resultRowPointer'? Im Allgemeinen ist das Inkrementieren von Zeigern sicher. Wenn es sich jedoch um einen benutzerdefinierten Typ mit einem überschriebenen Operator + = 'handelt, müssen Sie die Sicherheit der benutzerdefinierten Funktion überprüfen. – inetknght
Dies könnte nützlich sein, um Ihre Frage zu beantworten: http://stackoverflow.com/questions/2728299/why-is-comparing-against-end-iterator-legal –