Ist Zeigerarithmetik mit Nicht-Array-Zeigern ein undefiniertes Verhalten?
Der C-Standard legt fest, dass das Addieren oder Subtrahieren eines Integralausdrucks zu einem Zeiger zu Ergebnissen führt in einem Zeiger des gleichen Typs. Wenn der Zeiger jedoch ursprünglich auf ein Element innerhalb eines Arrays zeigt, muss der resultierende Zeiger auch auf ein gültiges Element innerhalb des Arrays zeigen. Dies wirft die Frage auf: Ist es undefiniertes Verhalten (UB), einem „char *“-Zeiger hinzuzufügen, der nicht tatsächlich auf ein Zeichenarray zeigt?
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;
Line () führt einen reinterpret_cast durch, um die Adresse von f in einen „char “-Zeiger umzuwandeln und fügt dann den Offset des z-Mitglieds hinzu. Der resultierende Zeiger p wird verwendet, um den Wert von f.z. zu ändern.
Laut Standard sollte diese Zeile zu UB führen, da p nicht auf ein Zeichenarray zeigt. Es wird jedoch allgemein angenommen, dass es zulässig ist, solche Zeiger zu verwenden, um die zugrunde liegende Speicherdarstellung von Objekten zu manipulieren.
Der Standard gibt nicht ausdrücklich an, dass es sich dabei um UB handelt, verlangt aber, dass Objekte trivial kopierbarer Typen dies können in ein Array aus char oder unsigned char kopiert werden. Dies legt nahe, dass Zeigerarithmetik für Zeiger auf die Rohbytes definiert werden sollte, aus denen ein Objekt besteht, um die obige Operation zu ermöglichen.
Daher kann man vernünftigerweise schlussfolgern, dass das Hinzufügen zu einem „char *“-Zeiger dies bewirkt „t auf ein Zeichenarray zeigen“ ist in Szenarien, in denen die zugrunde liegenden Bytes in ein Array kopiert werden sollen, kein UB.
Das obige ist der detaillierte Inhalt vonIst die Zeigerarithmetik auf Nicht-Array-Zeigern mit „reinterpret_cast' undefiniertes Verhalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!