なぜsizeof
voidポインタ2
?
void*
のサイズは、プラットフォームに依存する値です。通常、32ビットプラットフォームと64ビットプラットフォームの場合、値はそれぞれ4バイトまたは8バイトです。値として2を取得している場合は、16ビットのコーディングプラットフォームで実行している可能性があります(またはコーディングエラーが発生している可能性があります)。
使用しているコードと、環境/オペレーティングシステムに関する詳細情報を投稿していただけますか?
オンラインC標準(n1256ドラフト) に従って:
6.2.5タイプ
...
27 Voidへのポインタは、文字型へのポインタと同じ表現および配置要件を持たなければならない。39)同様に、互換性のある型の修飾されたバージョンまたは修飾されていないバージョンへのポインターは、同じ表現と配置の要件を持たなければなりません。構造体型へのすべてのポインタは、互いに同じ表現と配置の要件を持たなければなりません。共用体型へのすべてのポインタは、互いに同じ表現と配置の要件を持たなければなりません。他の型へのポインターは、同じ表現または配置要件を持つ必要はありません。
システムでvoidポインターとcharポインターのサイズが2になっている理由については、16ビットプラットフォームを使用しているためと考えられます。
ポインターは、別のものを指すメモリアドレスを格納します。ポインタのサイズはプラットフォームによって異なります。 32ビットプラットフォームでは、メモリアドレスを格納するために32ビットまたは4バイトが必要なので、sizeofポインタは4を返します。
Sizeof(void *)が2の場合、おそらく16ビットプラットフォームで実行されています。
JaredParがすでに指摘したように、これはプラットフォームに依存します。別の言い方をすると、使用されているCPUはメモリアドレス指定に何ビットを使用しますか? 16ビットアドレスの場合、サイズは2バイトになります。 16ビットマイクロコントローラーのコードをコンパイルしていますか?
ポインタのサイズは、整数のサイズと同じです。 16ビットコンパイラでは2バイト、32ビットコンパイラでは4バイト、64ビットコンパイラでは8バイトにすることができます。
void *ptr
、int *ptr
およびchar *ptr
は同じサイズになりますが、そうするとptr++
、対応するポインターは、そこのデータ型に従ってジャンプします。つまり、void
およびchar
の場合は1ポジション。同様に、int
の場合は4ポジション。