C で Null ポインターを介したメソッドの呼び出しが機能する場合があるのはなぜですか?

Mary-Kate Olsen
リリース: 2024-11-01 02:27:27
オリジナル
921 人が閲覧しました

Why Does Invoking a Method Through a Null Pointer in C   Sometimes Work?

未定義の動作の理解: C での Null ポインター メソッド呼び出し

一見直観的にエラーが予想されるにもかかわらず、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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!