Tutti gli esempi che sono stato in grado di trovare online sull'incremento di un puntatore che causa un segfault implicano la dereferenziazione del puntatore - cosa succede se voglio solo incrementarlo (ad esempio alla fine di un ciclo for) e io Non importa se finisce nella memoria non valida perché non la userò più. Ad esempio, in questo programma ho solo bisogno di passare da 4 ogni iterazione, ma non rinuncio mai più a questi puntatori dopo l'ultima iterazione.È possibile incrementare un puntatore senza dereferenziamento ancora segfault o avere altre cattive intenzioni (non definite)?
float* leftRowPointer, resultRowPointer;
// assume they were correctly initialized
for (unsigned int i = 0; i < 4; ++i, leftRowPointer += 4, resultRowPointer += 4) {
// do some stuff
}
Ho invece bisogno di fare qualcosa del genere?
for (unsigned int i = 0; i < 4; ++i) {
// same stuff
if (i != 3) {
leftRowPointer += 4;
resultRowPointer += 4;
}
}
C'è un modo migliore per realizzare ciò che sto cercando di fare?
Quando l'ho provato personalmente non sembra succedere niente di male, ma non è certo una garanzia che funzionerà sempre, e sfortunatamente non ho accesso a Valgrind o simili al lavoro.
Stiamo usando lo standard C++ 11, FWIW, e non ho trovato nulla che si applichi direttamente a questo, ma sarò il primo ad ammettere che non conosco bene lo standard abbastanza per avere una buona idea di dove cercarlo.
Cerca in Operatori additivi (probabilmente [expr.plus] o qualcosa come §5.5). – chris
Quali sono i tipi di 'leftRowPointer' e' resultRowPointer'? In generale, i puntatori incrementali sono sicuri. Se, tuttavia, si tratta di un tipo personalizzato con operatore 'sovrascritto + =', allora sarà necessario verificare la sicurezza della funzione personalizzata. – inetknght
Questo potrebbe essere utile per rispondere alla tua domanda: http://stackoverflow.com/questions/2728299/why-is-comparing-against-end-iterator-legal –