ホームページ > バックエンド開発 > C++ > char* は他のオブジェクト ポインタにエイリアスできるのに、その逆はできないのはなぜですか?

char* は他のオブジェクト ポインタにエイリアスできるのに、その逆はできないのはなぜですか?

Susan Sarandon
リリース: 2024-11-12 08:52:02
オリジナル
896 人が閲覧しました

Why Can a char* Alias Other Object Pointers but Not the Other Way Around?

厳密なエイリアシング ルールにより 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
ログイン後にコピー
この例では、charptr は構造体のバイトを安全にエイリアスできるため、structptr の値を charptr に割り当てることができます。ただし、structptr はより制限的なアライメント ルールでは char* のバイトに正しくアクセスできないため、逆の代入は許可されません。

以上がchar* は他のオブジェクト ポインタにエイリアスできるのに、その逆はできないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート