C での Null ポインターを使用した静的メンバーへのアクセス
C では、null ポインターを介して非静的クラス メンバーにアクセスすると、未定義の動作に。ただし、null ポインターを使用して静的メンバーにアクセスしようとすると、驚くべきことがわかります。このコード サンプルは、予期しない動作を示しています。
<code class="cpp">struct demo { static void fun() { std::cout << "fun() is called\n"; } static int a; }; int demo::a = 9; int main() { demo* d = nullptr; d->fun(); std::cout << d->a; return 0; }</code>
このプログラムをコンパイルして実行すると、ランタイム エラーなしで予期した出力が生成されます。非静的メンバーは未定義の動作を示すのに、なぜ Null ポインターを使用した静的メンバーへのアクセスが許可されるのですか?
標準解釈
認識されている曖昧さにもかかわらず、 C 標準では、このシナリオが明示的に許可されています。この動作は、次の要素によって明確に定義されています。
未定義の動作の影響
C 標準では null ポインターを使用して静的メンバーにアクセスすることが許可されていますが、この方法はお勧めできないことに注意することが重要です。以下の理由から、これは依然として疑わしいアプローチです。
代替ベスト プラクティス:
null ポインターを介して静的メンバーにアクセスする代わりに、それを使用することをお勧めします。クラス名を直接使用します。これにより、未定義の動作のリスクを伴うことなく、クラスレベルのプロパティと関数への明確かつ一貫したアクセスが保証されます。
<code class="cpp">// Use the class name directly to access static members int main() { demo::fun(); std::cout << demo::a; return 0; }</code>
これらのベスト プラクティスを遵守し、静的メンバー アクセスでの null ポインターの使用を回避することで、開発者は次のことを行うことができます。安全で信頼できる C コード。
以上が非静的メンバーにアクセスすると未定義の動作が発生するのに、C では null ポインターを使用した静的メンバーへのアクセスが許可されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。