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; }
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?
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.
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!