Behandeln eines 2D-Arrays als 1D-Array: Undefiniertes Verhalten
In C und C werden mehrdimensionale Arrays zusammenhängend im Speicher gespeichert. Der Zugriff auf ein mehrdimensionales Array mit eindimensionaler Indizierung kann jedoch zu undefiniertem Verhalten führen.
Betrachten Sie den folgenden Code:
int a[25][80]; a[0][1234] = 56; // Line 2 int* p = &a[0][0]; p[1234] = 56; // Line 4
Zeile 2:
Dies Zeile versucht, auf ein Element zuzugreifen, das außerhalb der Grenzen des Arrays a[25][80] liegt. Die erste Dimension von a hat eine Größe von 25, aber Zeile 2 versucht, auf das 1235. Element zuzugreifen, das außerhalb des gültigen Bereichs liegt. Dies führt zu undefiniertem Verhalten, da es gegen die Sprachdefinition verstößt.
Zeile 4:
Diese Zeile löst auch undefiniertes Verhalten aus. Das Array a hat 25 * 80 = 2000 Elemente, während p auf den Anfang des Arrays zeigt. Der Ausdruck p[1234] versucht daher auf das 1235. Element des Arrays zuzugreifen, das außerhalb des gültigen Bereichs liegt. Das Subskribieren eines Arrays mithilfe eines Zeigers, der seine Grenzen überschreitet, gilt als undefiniertes Verhalten.
Konstante Ausdrücke:
Das undefinierte Verhalten im obigen Code manifestiert sich auch in konstanten Ausdrücken. Der folgende Code wird aufgrund undefinierten Verhaltens nicht kompiliert:
constexpr int f(const int (&a)[2][3]) { auto p = &a[0][0]; return p[3]; // Undefined behavior } int main() { constexpr int a[2][3] = { 1, 2, 3, 4, 5, 6, }; constexpr int i = f(a); }
Dies zeigt, dass undefiniertes Verhalten in konstanten Ausdrücken immer noch illegal ist und Compiler solchen Code ablehnen.
Das obige ist der detaillierte Inhalt vonWarum führt die Behandlung eines 2D-Arrays als 1D-Array in C/C zu undefiniertem Verhalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!