Zeigerarithmetik auf Nicht-Zeichen-Arrays
In C ist das Verhalten der Zeigerarithmetik für Zeiger, die auf Arrays oder Punkte verweisen, genau definiert zum Anfang eines Arrays. Es treten jedoch Fragen auf, wenn Zeigerarithmetik auf Zeiger angewendet wird, die nicht direkt auf Zeichenarrays zeigen.
Beachten Sie den folgenden Codeausschnitt:
struct Foo { float x, y, z; }; Foo f; char *p = reinterpret_cast<char *>(&f) + offsetof(Foo, z);
Die mit (*) markierte problematische Zeile weist dem p-Zeiger die Adresse des z-Mitglieds der Foo-Struktur zu. Gemäß dem Standard (expr.add/4) könnte dieser Vorgang als undefiniertes Verhalten (UB) betrachtet werden, da p nicht auf ein char-Array zeigt.
Der Standard gibt jedoch auch an, dass die zugrunde liegenden Bytes von any Ein trivial kopierbares Objekt kann in ein Array aus char oder unsigned char kopiert werden. Dies impliziert, dass die Zeigerarithmetik für Zeiger auf die Rohbytes gültig sein sollte, aus denen ein Objekt besteht, unabhängig davon, ob sie ein Array bilden.
In diesem speziellen Fall besteht die Absicht hinter dem Code darin, auf das z-Mitglied zuzugreifen mit reinterpret_cast. Obwohl der Standard nicht ausdrücklich angibt, dass in solchen Szenarien Zeigerarithmetik definiert ist, würde dies den Nutzen von offsetof stark einschränken, wenn dies nicht der Fall wäre.
Daher wird der Zusatz in Zeile (*) als gültig angesehen in C . Die Zeigerarithmetik auf p ist zulässig und zeigt korrekt auf das z-Mitglied innerhalb der Foo-Struktur.
Das obige ist der detaillierte Inhalt vonIst Zeigerarithmetik auf Nicht-Zeichen-Arrays in C definiertes Verhalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!