関数ポインタとデータ ポインタ: 互換性のないメモリのアドレス指定
関数ポインタをデータ ポインタに変換 (またはその逆) することは、C では驚くべきことに許可されています。 /C 、この利便性はすべてのプラットフォームで保証されているわけではありません。ここで疑問が生じます: なぜこれらのポインタは本質的に互換性がないのでしょうか?
答えはメモリ管理のアーキテクチャにあります。ハーバード アーキテクチャなどの一部のアーキテクチャでは、コードとデータは別個のメモリ領域に存在します。これらのシステムでは、関数ポインタ (命令を指す) をデータ ポインタ (通常の値を指す) にシームレスに変換することはできません。これは、関数ポインタが別のメモリ ドメインに存在するためです。
逆に、フォン ノイマン アーキテクチャでは、コードとデータが共存します。同じメモリ空間内では、関数ポインタとデータ ポインタには互換性があるように見えます。ただし、C/C は特定のアーキテクチャに限定されず、両方のタイプのシステムで潜在的に実行できるコードを許可します。
その結果、すべてのアーキテクチャ間で互換性を維持するために、C/C は単純に関数を扱うことはできません。メインメモリへの交換可能なアドレスとしてのポインタとデータポインタ。非互換性の可能性は、C/C が対応する必要があるアーキテクチャ設計の多様性に起因します。
以上がC/C で関数ポインタとデータ ポインタに互換性がないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。