Heim > Backend-Entwicklung > C++ > Ist es in C zulässig, die Adresse eines Array-Elements eins über das Ende hinaus zu übernehmen?

Ist es in C zulässig, die Adresse eines Array-Elements eins über das Ende hinaus zu übernehmen?

Linda Hamilton
Freigeben: 2024-12-18 01:40:10
Original
466 Leute haben es durchsucht

Is it Legal in C   to Take the Address of an Array Element One Past the End?

Können Sie die Adresse eines Array-Elements eins über das Ende hinaus übernehmen?

Der folgende Code war Gegenstand von Debatten in der Programmierung community:

int array[5];
int *array_begin = &array[0];
int *array_end = &array[5];
Nach dem Login kopieren

Konkret ging es in diesem Zusammenhang um die Frage, ob &array[5] legaler C-Code ist angehoben.

Die Haltung des C-Standards

Gemäß dem C-Standard, insbesondere:

  • §6.5.2.1: Eine tiefgestellte Bezeichnung (E1[E2]) entspricht *((E1) (E2)).
  • §6.5.3.2: Wenn Sie die Adresse eines Ausdrucks verwenden, der sich aus einem []-Operator ergibt, ist dies gleichbedeutend mit dem Ersetzen von [] durch .

Auswirkungen für &array[5]

Anwenden dieser Regeln auf &array[5], wir haben:

  • &array[5] entspricht &array[0] 5.
  • &array[0] 5 zeigt ein Element nach dem Ende des Arrays.

Ist es legal?

Ja, das ist es ist legal. Der Standard erlaubt ausdrücklich, dass Zeiger auf ein Element über das Ende eines Arrays hinaus zeigen, sofern sie nicht dereferenziert werden. In diesem Fall wird &array[5] nur zum Abrufen einer Adresse verwendet, nicht zum Zugriff auf den Wert an dieser Adresse. Es liegt also innerhalb der Grenzen dessen, was der Standard zulässt.

Warum der Unterschied zu Array 5 oder &array[4] 1?

Das Verhalten von &array[5] unterscheidet sich von Array 5 oder &array[4] 1 aufgrund auf den Vorrang der und []-Operatoren in Kombination mit dem Verhalten des durch [] implizierten unären *-Operators. Konkret:

  • Array 5 wird als *(Array 5) ausgewertet, was versucht, einen Zeiger zu dereferenzieren, der eins über das Ende des Arrays hinaus zeigt, was ein undefiniertes Verhalten ist.
  • &array[4 ] 1 wird als &*(Array 4) 1 ausgewertet, was Array 5 entspricht, und versucht daher auch, einen Zeiger zu dereferenzieren, der auf eins über das Ende hinaus zeigt des Arrays.

Im Gegensatz dazu wird &array[5] so ausgewertet, als ob der &-Operator entfernt und der []-Operator in einen Operator geändert würde, was zu Array 5 führt, jedoch ohne die Auswertung des unärer *-Operator.

Das obige ist der detaillierte Inhalt vonIst es in C zulässig, die Adresse eines Array-Elements eins über das Ende hinaus zu übernehmen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage