Vor wenigen Tagen sah ich Code wie folgt:Zeiger als C++ Iterator
#include <iostream>
void test(const int *x, int max){
for(auto it = x; it < x + max; ++it)
std::cout << *it << std::endl;
}
int main(){
constexpr int MAX = 5;
constexpr int x[MAX] = { 1,2,4,5,7 };
test(x, MAX);
}
Neben Anwendungen von auto
und constexpr
, der Code funktioniert OK in C++11
, C++
und sogar in C
.
Es gibt jedoch etwas, das mich abgehört - der Code Zugriff auf das Element nach dem letzten Element z. - x[5]
. Ich glaube in einigen Fällen könnte dies Adressverletzung sein, zum Beispiel wenn Sie mmap()
etwas Speicher und versuchen, Speicher nach was Sie mmap-ed lesen. Eine andere Möglichkeit ist, wenn das Array im Nur-Lese-Speicher zugeordnet ist.
Bin ich richtig mit meiner Annahme? Ich weiß, dass ich falsch liege, aber warum?
Nein, es greift nicht auf das Element nach dem letzten Element zu. Es erstellt nur einen Zeiger auf ein solches Element, der es jedoch niemals dereferenziert. Dies wird von den relevanten Standards ausdrücklich erlaubt (es ist wichtig, dass die zeigerbasierte Iteration funktioniert). –
'und sogar in C' Nonsense. –