Heim >Backend-Entwicklung >C++ >Warum ist es in C erlaubt, mit einem Nullzeiger auf statische Elemente zuzugreifen?

Warum ist es in C erlaubt, mit einem Nullzeiger auf statische Elemente zuzugreifen?

Susan Sarandon
Susan SarandonOriginal
2024-11-03 01:33:02941Durchsuche

Why is it allowed to access static members using a null pointer in C  ?

Zugriff auf statische Mitglieder mithilfe von Nullzeigern im C-

Kontext

Betrachten Sie das folgende Programm:

<code class="cpp">#include <iostream>
class Demo
{
public:
    static void func() { std::cout << "func() called" << std::endl; }
    static int num = 9;
};

int main()
{
    Demo* d = nullptr;
    d->func();
    std::cout << d->num << std::endl;
    return 0;
}

Frage

Dieses Programm lässt sich fehlerfrei kompilieren und ausführen, während der Zugriff auf statische Elemente über einen Nullzeiger im Allgemeinen als undefiniertes Verhalten gilt. Warum ist das erlaubt?

Antwort

TL;DR:

Das angegebene Programm löst kein undefiniertes Verhalten aus, da dies bei der Indirektion durch einen Nullzeiger nicht der Fall ist Von Natur aus problematisch, es sei denn, es umfasst weitere Operationen, die auf einer gültigen Objektidentität basieren.

Erklärung:

Ob die Indirektion durch Nullzeiger ein an sich undefiniertes Verhalten ist, war umstritten . Die einzige fragwürdige Operation im Programm ist die Auswertung des Ausdrucks d->a.

d->a ist aufgrund der Zeiger-Dereferenzierungsregeln äquivalent zu (*d).a. Auch wenn *d undefiniert ist, wird der Ausdruck *d dennoch ausgewertet, insbesondere wenn sein Ergebnis verworfen wird, wie im Fall von d->a. Dieses Verhalten ist klar definiert.

Das Verhalten bei statischen Mitgliedern unterscheidet sich vom Zugriff auf nicht statische Mitglieder über einen Nullzeiger, der tatsächlich undefiniertes Verhalten auslösen sollte, da es eine ungültige Objektidentität impliziert. Im Gegensatz dazu ist für den Zugriff auf statische Mitglieder keine Objektidentität erforderlich, und ihr Verhalten ist explizit im Standard definiert.

Zusätzliche Überlegungen

  • CWG-Problem Nr. 232 verdeutlicht die Diskrepanz zwischen der Behandlung der Indirektion durch Nullzeiger im C-Standard, was darauf hindeutet, dass dies möglicherweise nicht zwangsläufig zu undefiniertem Verhalten führt.
  • CWG-Problem Nr. 315 befasst sich speziell mit dem Szenario des Aufrufs einer Mitgliedsfunktion über einen Nullzeiger und bekräftigt, dass die Indirektion selbst dies ist Kein Fehler, es sei denn, es handelt sich um weitere Vorgänge, die auf der Objektidentität basieren.
  • Das Verwerfen des Ergebnisses eines Ausdrucks (Ausdruck mit verworfenem Wert) wird anders behandelt als der Zugriff auf den Wert, was je nach Kontext Fehler auslösen kann.

Fazit

Das angegebene Programm stellt keinen Schaden dar, da die Auswertung von *d im Kontext des Zugriffs auf statische Mitglieder zulässig ist. Die Indirektion durch Nullzeiger allein führt nicht unbedingt zu undefiniertem Verhalten, es ist jedoch wichtig, sich der potenziellen Risiken bewusst zu sein, die mit weiteren Vorgängen verbunden sind, die eine Objektidentität erfordern.

Das obige ist der detaillierte Inhalt vonWarum ist es in C erlaubt, mit einem Nullzeiger auf statische Elemente zuzugreifen?. 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