一見直観的にエラーが予想されるにもかかわらず、C での Null ポインターを介したメソッド呼び出しは実行されているように見える場合があります。この動作により、コンパイラで使用される標準準拠と最適化の実践に関する疑問が生じます。
この問題を詳しく調べるために、次の例を検討してください。
<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>
このスニペットでは、クラス テストが定義されています。コンストラクターと show() メソッドを使用します。 main() 関数では、ポインター ptr が NULL に初期化され、その後、ptr を通じて show() メソッドが呼び出されます。
驚くべきことに、プログラムはエラーなしで実行され、コンストラクターをトリガーせずに「show fun known」を出力します。 。これは、C ではコンパイラが null ポインターの型を認識しているため、メソッドのコードを識別できるためです。 show() メソッドは this ポインタを利用しないため、正常に実行されます。
ただし、この動作は C 標準では未定義とみなされます。コンパイラは、メソッドを呼び出す前にポインタが NULL かどうかをチェックしないことによってコードを最適化することができます。この最適化により効率は向上しますが、安全性と予測可能性が損なわれます。
以上がC で Null ポインターを介したメソッドの呼び出しが機能する場合があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。