In C kann auf statische Mitglieder einer Klasse über einen Nullzeiger zugegriffen werden, ohne undefiniertes Verhalten hervorzurufen. Dieses Verhalten, das überraschend erscheinen mag, kann durch Untersuchung der Definitionen und Gründe der Sprache erklärt werden.
Beim Zugriff auf ein Klassenmitglied über einen Nullzeiger ist das Verhalten gut- definiert, solange die Auswertung des Operanden nicht die Identität oder den gespeicherten Wert des Referenten erfordert. Wenn Sie beispielsweise auf eine statische Mitgliedsvariable d->a zugreifen, wird lediglich der Ausdruck *(d) ausgewertet, um die Referenz auf das Objekt zu erhalten, es werden jedoch keine Vorgänge ausgeführt, die eine Initialisierung des Referenten erfordern.
Diese Auswertung Der Prozess wird von [expr.ref]/2 unterstützt, das besagt, dass d->a in ((d)).a konvertiert wird. Die Auswertung von ((d)), dargestellt durch *d, verläuft ohne Fehler auszulösen, da das durch d referenzierte Objekt nicht erforderlich ist.
Der C-Standard gibt nicht explizit an, dass die Indirektion durch einen Nullzeiger grundsätzlich zu undefiniertem Verhalten führt. Tatsächlich deuten die CWG-Probleme Nr. 232 und Nr. 315 darauf hin, dass bloße Indirektion kein Problem darstellt.
Das Hauptargument für diese Haltung liegt in der Existenz klar definierter Szenarien, in denen Indirektion durch Nullzeiger zulässig ist. Beispielsweise ermöglicht [expr.typeid]/2, dass typeid(*((A*)0)) eine bad_typeid-Ausnahme auslöst, auch wenn *d als null ausgewertet wird. Wenn eine bloße Indirektion UB aufrufen würde, wäre diese Aussage nicht genau definiert.
In Ihrem Beispiel
<code class="cpp">int main() { demo* d = nullptr; d->fun(); std::cout << d->a; return 0; }</code>
das Programm wird ohne kompiliert und ausgeführt Fehler, da der Aufruf statischer Memberfunktionen oder der Zugriff auf statische Variablen nicht die Identität des Referenten erfordert. Ihr Programm weist daher keine inhärenten Probleme oder undefiniertes Verhalten auf.
Das obige ist der detaillierte Inhalt vonKönnen Sie mit Nullzeigern ohne undefiniertes Verhalten auf statische Elemente in C zugreifen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!