2

C 仕様 (主に C99) を最善を尽くして読むと、void *これらの型のいずれかの間でキャスト (または の暗黙的な変換動作が適用される場合は暗黙的に変換) が有効であると考えられます。

void *char *signed char *unsigned char *

これにより未定義の動作がトリガーされず、それらのポインターが同じ基本表現を持つことが保証されることを期待しています。

したがって、合法的に逆参照、型キャスト、および/またはそれを3つのchar型ポインターの1つに割り当てることができるアドレスをすでに指しているこれら4つの型のいずれかのポインターを取得し、それを逆参照してアクセスすることが可能でなければなりません唯一の違いは、コードがその場所のデータをcharsigned char、またはとして扱うかどうかunsigned charです。

これは正しいです?これが真実ではないC標準のバージョンはありますか(標準void *化前のCの型の欠如は耐えられません)?

PSこの質問は、他の多くの質問を渡すことで断片的に回答されていると思いますが、これが明示的に述べられている/確認されている単一の明確な回答を見たことはありません.

4

1 に答える 1

1

したがって、合法的に逆参照、型キャスト、および/またはそれを3つのchar型ポインターの1つに割り当てることができるアドレスをすでに指している4つの型のいずれかのポインターを取得し、それを逆参照してアクセスすることが可能でなければなりません唯一の違いは、コードがその場所のデータを char、signed char、または unsigned char として扱うかどうかです。

正解です。実際、任意の型のオブジェクトへの有効なポインターを取得し、それらの 3 つのうちのいくつかに変換して、メモリにアクセスすることができます。

void *and etc. が同じ表現とアラインメントの要件を持っていることについての規定を正しく言及していchar *ますが、実際には問題ではありません。これは、指しているオブジェクトのプロパティではなく、ポインター自体のプロパティを参照します。

文字型を使用して任意のオブジェクトを読み書きできるという明示的な条項が含まれているため、厳密なエイリアシング ルールに違反することはありません。

たとえば 、signed char ch = -2;またはその他の負の値がある場合、 と(unsigned char)chは異なる場合があることに注意して*(unsigned char *)&chください。8 ビット文字を使用するシステムでは、前者は であることが保証されています254が、後者は、使用されている番号付けシステムに応じて254253、またはになる可能性があります。130

于 2016-02-01T02:41:46.243 に答える