非静的メンバーにアクセスすると未定義の動作が発生するのに、C では null ポインターを使用した静的メンバーへのアクセスが許可されるのはなぜですか?

Mary-Kate Olsen
リリース: 2024-11-02 05:40:29
オリジナル
776 人が閲覧しました

Why is accessing static members using null pointers allowed in C  , while accessing non-static members results in undefined behavior?

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 標準では、このシナリオが明示的に許可されています。この動作は、次の要素によって明確に定義されています。

  • 破棄された値の式:
    null ポインター "d" を介して静的メンバー "a" にアクセスする場合、式 *d は、破棄された値式とみなされます。これは、式は評価されますが、その値は破棄され、計算や代入には使用されないことを意味します。
  • Identity の非変更:
    null ポインターを介した間接化は試行されません。オブジェクトのアイデンティティを変更します。特定のオブジェクト インスタンスから独立した静的メンバーの場合、そのアイデンティティは null ポインターの影響を受けません。

未定義の動作の影響

C 標準では null ポインターを使用して静的メンバーにアクセスすることが許可されていますが、この方法はお勧めできないことに注意することが重要です。以下の理由から、これは依然として疑わしいアプローチです。

  • 実装の詳細への信頼:
    静的メンバー アクセスに null ポインターを使用する動作は、異なる実装間で保証されていません。コンパイラによっては、警告やエラーのフラグを立てる場合もありますが、問題なく許可する場合もあります。この実装固有の動作に依存すると、移植性の問題が発生する可能性があります。
  • 混乱とエラー:
    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 サイトの他の関連記事を参照してください。

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