Hinzufügen zu einem „char *“-Zeiger: UB oder nicht?
C 17 definiert Regeln für das Hinzufügen von Integralausdrücken zu Zeigern und gibt dies an Es kommt zu undefiniertem Verhalten, wenn das Ergebnis die Grenzen eines Arrays überschreitet, auf das verwiesen wird. Die Definition bezieht sich jedoch speziell auf Zeiger, die auf Elemente von Arrays zeigen.
Bedenken Sie den folgenden Codeausschnitt:
struct Foo { float x, y, z; }; Foo f; char *p = reinterpret_cast<char *>(&f) + offsetof(Foo, z); // (*) *reinterpret_cast<float *>(p) = 42.0f;
Es stellt sich die Frage, ob Zeile (*) undefiniertes Verhalten auslöst. Trotz der Neuinterpretation der Adresse zu einem Float als char-Zeiger zeigt sie nicht auf ein char-Array. Nach der zitierten Definition dürfte es sich also um undefiniertes Verhalten handeln. Allerdings wäre die Nützlichkeit des Makros offsetof in diesem Fall stark beeinträchtigt.
C ermöglicht jedoch auch das Kopieren der zugrunde liegenden Bytes jedes trivial kopierbaren Typs in ein Zeichenarray. Dieser Vorgang, der mit Funktionen wie std::memcpy oder manuell Byte für Byte ausgeführt werden kann, erfordert nicht, dass das ursprüngliche Objekt ein Array ist.
Um den Erfolg dieser byteweisen Operationen zu ermöglichen, muss daher die Für Zeiger, die auf die Rohbytes von Objekten zeigen, muss das Hinzufügen von Integralausdrücken zu Zeigern definiert werden. Ob diese Bytes implizit ein Array bilden oder eine besondere Ausnahme von den allgemeinen Additionsregeln darstellen, ist unklar. Dennoch würde jede Interpretation die Gültigkeit des Zusatzes im bereitgestellten Codebeispiel rechtfertigen. Daher führt das Hinzufügen zu einem „char *“-Zeiger in diesem Kontext nicht zu undefiniertem Verhalten.
Das obige ist der detaillierte Inhalt vonIst das Hinzufügen zu einem „char *'-Zeiger ein undefiniertes Verhalten, wenn dieser nicht auf ein Array zeigt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!