Heim >Backend-Entwicklung >C++ >Ist die Zeigeraddition undefiniert, wenn in C 17 nicht auf ein Zeichenarray gezeigt wird?

Ist die Zeigeraddition undefiniert, wenn in C 17 nicht auf ein Zeichenarray gezeigt wird?

Linda Hamilton
Linda HamiltonOriginal
2024-11-11 11:48:03509Durchsuche

Is Pointer Addition Undefined When Not Pointing to a Character Array in C  17?

Ist das Hinzufügen von Zeigern undefiniert, wenn nicht auf ein Char-Array gezeigt wird?

Der C 17-Standard besagt, dass das Hinzufügen ganzzahliger Werte zu Zeigern zu einem führt Zeiger desselben Typs wie der Operand, und das Ergebnis zeigt auf ein (hypothetisches) Element innerhalb eines Arrays, wenn die Operation innerhalb seiner Grenzen bleibt. Es bleibt jedoch unklar, ob dies für Zeiger gilt, die nicht auf char-Arrays zeigen.

Bedenken Sie den folgenden Code:

struct Foo {
    float x, y, z;
};

Foo f;
char *p = reinterpret_cast<char *>(&f) + offsetof(Foo, z); // (*)
*reinterpret_cast<float *>(p) = 42.0f;

Stellt die mit (*) markierte Zeile undefiniertes Verhalten dar ( UB)? Der Zeiger p zeigt auf ein Float, nicht auf ein Zeichenarray. Nach dem zitierten Absatz soll dies zu UB führen. Wäre es jedoch UB, würde dies den Nutzen von offsetof() erheblich einschränken.

Die Definition trivial kopierbarer Typen des Standards besagt, dass ihre zugrunde liegenden Bytes mithilfe von Funktionen wie std::memcpy in ein char-Array kopiert werden können . Dies impliziert, dass Additionen für Zeiger auf die Rohbytes definiert werden sollten, aus denen ein Objekt besteht, unabhängig davon, ob das Ergebnis zum Kopieren von Bytes in ein Array verwendet wird.

Ob dies impliziert, dass die beteiligten Bytes bereits ein Array bilden oder eine besondere Ausnahme von den üblichen Regeln für den Betreiber darstellen, ist unklar. Allerdings würde jede Interpretation den Zusatz im Code gültig machen. Daraus kann geschlossen werden, dass das Hinzufügen eines char *-Zeigers nicht unbedingt zu UB führt, auch wenn er nicht auf ein char-Array zeigt.

Das obige ist der detaillierte Inhalt vonIst die Zeigeraddition undefiniert, wenn in C 17 nicht auf ein Zeichenarray gezeigt wird?. 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