Kann man unter Berücksichtigung des folgenden Codes Zeigerarithmetik auf nullptr
ausführen?Die Nullptr- und Zeigerarithmetik
ich irgendwelche Offsets in einem anderen nullptr
zu einem nullptr
Ergebnisse übernehmen das Hinzufügen, bisher MSVC Ergebnisse produzieren, wie ich erwartet hatte, aber ich bin etwas unsicher darüber, ob mit nullptr
wie das ist sicher:
float * x = nullptr;
float * y = x + 31; // I assume y is a nullptr after this assigment
if (y != nullptr)
{
/* do something */
}
'int * a; a ++; 'ist UB, auch wenn ich den Zeiger nicht dereferenziere? Kannst du eine Referenz dafür geben? – user463035818
@ tobi303: Es gibt keine Referenz dafür, da der Standard nicht explizit angeben muss, dass er undefiniert ist. [expr.add]/5 definiert das Verhalten von pointer + integer * nur für Zeiger auf Arrays (oder pointer-to-object, das als ein Array von 1 fungiert). Wenn der Zeiger nicht auf ein Array zeigt, ist das Verhalten definitionsgemäß undefiniert (außer im Fall des Hinzufügens von 0, das [expr.add]/8 für alle Zeiger definiert). –
@ tobi303 UB bedeutet nicht "crash", es bedeutet "wir haben nicht definiert was das tut". Während dies geschieht, können Compiler aggressiv UB optimieren und erkennen und Ihr Programm sich extrem unerwartet verhalten. Eine Schule der Optimierung ist, "da UB nicht in einem wohlgeformten Programm auftreten kann, kann jede Logikkette, die zu UB führt, sicher als eine Möglichkeit eliminiert werden, bis hin zu expliziten' if'-Überprüfungen in Ihrem Code. " Kurz gesagt, UB kann zu * time travel * Bugs führen, bei denen sich Code, der weit von der UB entfernt ist, in einer Weise verhält, die nicht mit dem Code übereinstimmt, den Sie geschrieben haben. – Yakk