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!