Heim  >  Artikel  >  Backend-Entwicklung  >  Können Sie mit Nullzeigern ohne undefiniertes Verhalten auf statische Elemente in C zugreifen?

Können Sie mit Nullzeigern ohne undefiniertes Verhalten auf statische Elemente in C zugreifen?

Barbara Streisand
Barbara StreisandOriginal
2024-11-02 11:53:03177Durchsuche

Can You Access Static Members in C   Using Null Pointers Without Undefined Behavior?

Zugriff auf statische Mitglieder mithilfe von Nullzeigern in C

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.

Auswertung nicht initialisierter Zeiger

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.

Indirektion durch Nullzeiger und undefiniertes Verhalten

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.

Auswirkungen auf Ihr Programm

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!

Stellungnahme:
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