Heim > Backend-Entwicklung > C++ > Hauptteil

Ist Zeigerarithmetik auf Nicht-Zeichen-Arrays in C definiertes Verhalten?

Linda Hamilton
Freigeben: 2024-11-09 09:59:02
Original
906 Leute haben es durchsucht

Is Pointer Arithmetic on Non-Character Arrays in C   Defined Behavior?

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);
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage