Trotz der scheinbar intuitiven Erwartung eines Fehlers kann es so aussehen, als ob der Aufruf von Methoden über Nullzeiger in C ausgeführt wird. Dieses Verhalten wirft Fragen hinsichtlich der von Compilern verwendeten Standard-Compliance- und Optimierungspraktiken auf.
Um diese Angelegenheit zu vertiefen, betrachten Sie das folgende Beispiel:
<code class="cpp">#include <iostream> using namespace std; class test { int i; public: test():i(0){ cout << "ctor called" << endl;} void show() { cout << "show fun called" << endl; } }; int main(int argc , char *argv[]) { test *ptr = NULL; ptr->show(); return 0; }</code>
In diesem Snippet wird ein Klassentest definiert mit einem Konstruktor und einer show()-Methode. In der main()-Funktion wird ein Zeiger ptr auf NULL initialisiert und dann die show()-Methode über ptr aufgerufen.
Überraschenderweise wird das Programm fehlerfrei ausgeführt und gibt „show fun aufgerufen“ aus, ohne den Konstruktor auszulösen . Dies liegt daran, dass in C der Compiler den Typ des Nullzeigers kennt und so den Code der Methode identifizieren kann. Da die Methode show() den Zeiger this nicht verwendet, wird sie erfolgreich ausgeführt.
Dieses Verhalten gilt jedoch im C-Standard als undefiniert. Compiler dürfen Code optimieren, indem sie vor dem Aufruf einer Methode nicht prüfen, ob ein Zeiger NULL ist. Diese Optimierung verbessert zwar die Effizienz, beeinträchtigt jedoch die Sicherheit und Vorhersehbarkeit.
Das obige ist der detaillierte Inhalt vonWarum funktioniert das Aufrufen einer Methode über einen Nullzeiger in C manchmal?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!