厳密なエイリアシング ルールにより char* が他のオブジェクト ポインタのエイリアスを許可される理由
「」に対する受け入れられた回答で説明されている、厳密なエイリアシング ルール厳密なエイリアシング ルールとは何ですか?」には、同じメモリ位置へのアクセスに異なる型のポインタを使用できないと記載されています。ただし、char* にはこのルールの例外が存在します。
char のエイリアス例外*
厳密なエイリアス ルールにもかかわらず、char 他のオブジェクト型のポインタのエイリアスを作成します。これが可能なのは、char がシングルバイト粒度で任意のアドレスのメモリにアクセスできるためです。したがって、char* は、他の型のオブジェクトを構成するバイトを正しく読み取ることができます。
一方向エイリアシング
charのエイリアシング例外は次のとおりです。一方通行。これは、char は他のオブジェクト型のポインターにエイリアスを付けることができますが、その逆は成り立たないことを意味します。別のオブジェクト型のポインタ (struct something など) を char のエイリアスとして使用することはできません。
非対称の理由
理由この非対称性により、データ破損の可能性が生じます。別のオブジェクト型のポインターが charのエイリアスを許可されている場合、オブジェクト ポインターのより寛容な配置規則を使用して char のバイトを読み取ることが可能になります。 char* のバイトがオブジェクト タイプに対して正しく配置されていない可能性があるため、これにより、予測不能で誤った動作が発生する可能性があります。
例
例外を説明するには、次のようにします。次の例を考えてみましょう:char* charptr; struct something* structptr; charptr = (char*) structptr; // Allowed structptr = (struct something*) charptr; // Not allowed
以上がchar* は他のオブジェクト ポインタにエイリアスできるのに、その逆はできないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。