Speichert ein ungültiger Zeiger automatisch ein undefiniertes Verhalten?

Offensichtlich führt die Dereferenzierung eines ungültigen Zeigers zu undefiniertem Verhalten. Aber was ist mit einfachSpeicherun eine ungültige Speicheradresse in einer Zeigervariable?

Betrachten Sie den folgenden Code:

const char* str = "abcdef";
const char* begin = str;
if (begin - 1 < str) { /* ... do something ... */ }

Der Ausdruckbegin - 1 ergibt eine ungültige Speicheradresse. Beachten Sie, dass wir diese Adresse nicht dereferenzieren - wir verwenden sie einfach in der Zeigerarithmetik, um zu testen, ob sie gültig ist. Trotzdem müssen wir noch eine ungültige Speicheradresse in ein Register laden.

Also, ist das undefiniertes Verhalten? Ich hätte es nie gedacht, da eine Menge Zeigerarithmetik auf so etwas zu beruhen scheint und ein Zeiger eigentlich nichts anderes als eine ganze Zahl ist. Aber vor kurzem habe ich gehört, dass selbst das Laden eines ungültigen Zeigers in ein Register undefiniertes Verhalten ist, da bestimmte Architekturen automatisch einen Busfehler auslösen oder so etwas, wenn Sie das tun. Kann mir jemand einen Hinweis auf den relevanten Teil des C- oder C ++ - Standards geben, der dies so oder so regelt?

Antworten auf die Frage(14)

Ihre Antwort auf die Frage