Heim >Backend-Entwicklung >C++ >Führt der Zugriff auf ein 2D-Array-Element mithilfe der Zeigerarithmetik außerhalb seiner Grenzen zu undefiniertem Verhalten?

Führt der Zugriff auf ein 2D-Array-Element mithilfe der Zeigerarithmetik außerhalb seiner Grenzen zu undefiniertem Verhalten?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-31 12:35:09516Durchsuche

Does Accessing a 2D Array Element Using Pointer Arithmetic Beyond Its Bounds Result in Undefined Behavior?

Kann ein 2D-Array als verkettetes 1D-Array behandelt werden?

Bedenken Sie den folgenden Codeausschnitt:

int a[25][80];
a[0][1234] = 56;
int* p = &a[0][0];
p[1234] = 56;

Frage: Greift der Code über seine Grenzen hinaus auf das Array zu, was dazu führt? undefiniertes Verhalten?

Antwort: Ja, beide Zeilen 2 und 4 zeigen undefiniertes Verhalten.

In C ist die Array-Indizierung im Wesentlichen Zeigerarithmetik. Beim Zugriff auf a[i][j] übersetzt der Compiler es effektiv in *(a[i] j). In ähnlicher Weise bezieht sich p[i] auf *(p i).

In diesem Fall hat das Array a die Abmessungen 25 x 80. Die erste Zeile des Arrays, a[0], enthält 80 Elemente (im Bereich von a[0][0] bis a[0][79]) und wird an einem zusammenhängenden Speicherort zugewiesen.

Durch Zugriff auf a[0][1234] wird der Code versucht, auf ein Element am Index 1234 in der ersten Zeile zuzugreifen, obwohl a[0] nur Elemente im Bereich [0, 79] enthält. Dies liegt außerhalb der Grenzen und löst undefiniertes Verhalten aus.

Die gleiche Logik gilt für Zeile 4. Während p auf das erste Element von a[0] zeigt, ist das Array immer noch mit 25 x 80 dimensioniert. Zugriff auf p[ 1234] ist im Wesentlichen eine arithmetische Zeigeroperation außerhalb der Grenzen, die wiederum zu undefiniertem Verhalten führt.

Außerdem als Sprachanwalt In den Kommentaren wurde darauf hingewiesen, dass ein ähnlicher Codeausschnitt mit einem constexpr nicht kompiliert werden kann, weil der Compiler solche undefinierten Verhaltensweisen in einem konstanten Ausdruck erkennt:

constexpr int f(const int (&a)[2][3])
{
    auto p = &a[0][0];
    return p[3];
}

int main()
{
    constexpr int a[2][3] = { 1, 2, 3, 4, 5, 6, };
    constexpr int i = f(a);
}

Dies wird korrekt kompiliert, da der Zugriff auf p[3] mit a constexpr veranlasst den Compiler, das undefinierte Verhalten zu erkennen und einen Fehler auszulösen.

Das obige ist der detaillierte Inhalt vonFührt der Zugriff auf ein 2D-Array-Element mithilfe der Zeigerarithmetik außerhalb seiner Grenzen zu undefiniertem Verhalten?. 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