Ist das Speichern eines ungültigen Zeigers immer undefiniertes Verhalten?
In C und C führt die Dereferenzierung eines ungültigen Zeigers zu undefiniertem Verhalten. Es stellt sich jedoch die Frage: Stellt das bloße Speichern einer ungültigen Speicheradresse in einer Zeigervariablen ein undefiniertes Verhalten dar?
Bedenken Sie den folgenden Code:
<code class="c">const char* str = "abcdef"; const char* begin = str; if (begin - 1 < str) { /* ... do something ... */ }</code>
Hier wird der Ausdruck begin - 1 als ausgewertet eine ungültige Speicheradresse. Während wir darauf verzichten, es zu dereferenzieren, verwenden wir es in der Zeigerarithmetik, um seine Gültigkeit zu bestimmen. Bedeutet dieser Vorgang also undefiniertes Verhalten, da bestimmte Architekturen einen Busfehler auslösen können, wenn ein ungültiger Zeiger in ein Register geladen wird?
Die Antwort auf diese Frage liegt im C- oder C-Standard. Laut C Draft Standard ist das Speichern eines ungültigen Zeigers tatsächlich ein undefiniertes Verhalten. Abschnitt 6.5.6/8 des Standards definiert die Zeigerarithmetik, deckt jedoch nicht explizit den Fall ab, in dem der Operand auf eine ungültige Speicheradresse zeigt.
Daher lässt der C-Standard diesen Fall durch Weglassung unbestimmt, Dadurch wird das Verhalten undefiniert. Folglich gilt das Speichern eines ungültigen Zeigers in einer Zeigervariablen, auch wenn dieser nicht dereferenziert ist, als undefiniertes Verhalten in C und C gemäß dem aktuellen Standard.
Das obige ist der detaillierte Inhalt von## Ist das Speichern eines ungültigen Zeigers in C/C immer ein undefiniertes Verhalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!