4

重複の可能性:
異なるタイプへのポインターのサイズが異なるプラットフォームはありますか?

私はいくつかの場所で、標準に準拠したC実装では、異なるタイプのポインターが異なる表現を持つ可能性があることを読みました。これは、ポインタ引数をprintfにキャストする必要があることの1つです。

int foo;
printf("address is %p\n", (void *) &foo);

私はこれに懐疑的で、C99標準(ドキュメントWG14 N1256、http: //www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdfで入手可能)を調べました。6.2.5.27では、次のようになります。

voidへのポインタは、文字型へのポインタと同じ表現および配置要件を持つ必要があります。同様に、互換性のあるタイプの修飾バージョンまたは非修飾バージョンへのポインターは、同じ表現および配置要件を持つ必要があります。構造体タイプへのすべてのポインタは、互いに同じ表現と配置の要件を持つ必要があります。共用体型へのすべてのポインターは、互いに同じ表現および配置要件を持つ必要があります。 他のタイプへのポインタは、同じ表現または配置要件を持つ必要はありません。

したがって、実際には、準拠するC99実装が、さまざまなタイプのポインターにさまざまな表現を使用できるように聞こえます。

私の質問はこれです:異なるタイプのポインタに異なる表現を実際に使用するCの実装/アーキテクチャは何ですか?

4

2 に答える 2

4

おそらく最もよく知られているのは、選択したメモリモデルに応じて16ビットデータポインタと32ビット関数ポインタを持つことができるリアルモードx86プロセッサです(または、16ビット関数ポインタを持つ32ビットデータポインタを持つことができます)。 、またはまた別の何か...)。

于 2010-10-05T03:16:19.657 に答える
4

Classic Cray(新製品についてはわかりません)は、通常のポインターで文字をアドレス指定できなかったためchar*void*ネイティブのベクトルポインターとは異なりました。

(ただし、以下のキースのコメントを参照してください。使用中のABIが異なる可能性があり、下位アドレスビットを上位端にローテーションすることで、「細かい」ポインターと「粗い」ポインターを互換性のあるものにすることがありました。程度。)

于 2010-10-05T03:27:50.453 に答える