Heim > Backend-Entwicklung > C++ > Ist der Zugriff auf ein 2D-Array als zusammenhängendes 1D-Array in C undefiniertes Verhalten?

Ist der Zugriff auf ein 2D-Array als zusammenhängendes 1D-Array in C undefiniertes Verhalten?

DDD
Freigeben: 2024-12-22 02:08:15
Original
739 Leute haben es durchsucht

Is Accessing a 2D Array as a Contiguous 1D Array in C Undefined Behavior?

Kann ein 2D-Array als zusammenhängendes 1D-Array behandelt werden?

Das Subskribieren in C führt zur Zeigeraddition, gefolgt von der Indirektion. Betrachten Sie den folgenden Code:

int a[25][80];
a[0][1234] = 56;
int* p = &a[0][0];
p[1234] = 56;
Nach dem Login kopieren

Ruft die zweite Zeile undefiniertes Verhalten auf? Was ist mit der vierten Zeile?

Antwort:

Beide Zeilen führen zu undefiniertem Verhalten.

Gemäß C Standardmäßig führt das Hinzufügen eines Zeigers zu einem Array-Element nur dann zu einem gültigen Verhalten, wenn der resultierende Index innerhalb der Grenzen des Arrays liegt. In diesem Fall hat a[0] die Größe 80 und Indizes außerhalb dieses Bereichs sind undefiniert.

Erklärung:

Subskription entspricht Folgendem:

a[0][1234] == *(a[0] + 1234)
Nach dem Login kopieren

Da a[0] auf das erste Element der ersten Zeile von a zeigt, ist die Zeigeraddition a[0] 1234 versucht, auf ein Element jenseits des Zeilenendes zuzugreifen. Dies führt zu undefiniertem Verhalten.

Ähnlich versucht die vierte Zeile, einen Wert außerhalb der Zeilengrenzen zu ändern:

p[1234] == *(p + 1234)
Nach dem Login kopieren

Auch wenn p auf das erste Element von a zeigt, wird versucht Das Ändern eines Elements über die Grenzen seiner zugrunde liegenden Zeile hinaus führt zu undefiniertem Verhalten.

Es ist wichtig zu beachten, dass diese Art von undefiniertem Verhalten von nicht erkannt wird Compiler. Daher muss unbedingt sichergestellt werden, dass Zeigerarithmetikoperationen zur Laufzeit innerhalb der Grenzen gültiger Array-Elemente bleiben.

Das obige ist der detaillierte Inhalt vonIst der Zugriff auf ein 2D-Array als zusammenhängendes 1D-Array in C undefiniertes Verhalten?. 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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage