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];
Nach dem Login kopieren
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!