Kann ein Array-Subskriptionspunkt über Array-Grenzen hinausgehen?
Es stellt sich die Frage, ob der folgende Code mit dem C-Standard kompatibel ist:
int array[5];
int *array_begin = &array[0];
int *array_end = &array[5];
Im Einzelnen ist die Gültigkeit von &array[5] in diesem Zusammenhang unter Prüfung.
C-Standard
Gemäß dem C99-Standardentwurf:
-
§6.5.2.1, Absatz 2: „E1[E2] ist identisch mit (*((E1) (E2)))“
-
§6.5.3.2, Absatz 3 (Hervorhebung): „Wenn der Operand das Ergebnis eines []-Operators ist, gilt weder der &-Operator noch der unäre * das durch [] impliziert wird, wird ausgewertet und das Ergebnis ist so, als ob der &-Operator entfernt und der []-Operator in a geändert würde Operator.“
-
§6.5.6, Absatz 8: „Wenn der Ausdruck P um eins nach dem letzten Element eines Array-Objekts zeigt, zeigt der Ausdruck (P) 1 um eins nach dem letzten Element des Array-Objekts, und wenn der Ausdruck Q eins hinter das letzte Element eines Array-Objekts zeigt, zeigt der Ausdruck (Q) - 1 auf das letzte Element des Arrays Objekt.“
Schlussfolgerung
Diese Bestimmungen weisen darauf hin, dass:
- Zeiger können legitimerweise auf ein Element über das Ende eines hinaus verweisen Array (ohne dereferenziert zu werden).
- &array[5] ist äquivalent zu &*(array 5), was wiederum ist äquivalent zu (Array 5).
- (Array 5) zeigt eins über das Ende des Arrays hinaus.
- Da &array[5] nicht zu einer Dereferenzierung führt, ist es gemäß der zulässig C-Standard.
Das obige ist der detaillierte Inhalt vonIst „&array[5]' ein gültiger Zeiger in C über Array-Grenzen hinaus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!
Stellungnahme:Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn