web-dev-qa-db-ja.com

sizeof voidポインター

なぜsizeof voidポインタ2

22
alfesani

void*のサイズは、プラットフォームに依存する値です。通常、32ビットプラットフォームと64ビットプラットフォームの場合、値はそれぞれ4バイトまたは8バイトです。値として2を取得している場合は、16ビットのコーディングプラットフォームで実行している可能性があります(またはコーディングエラーが発生している可能性があります)。

使用しているコードと、環境/オペレーティングシステムに関する詳細情報を投稿していただけますか?

42
JaredPar

オンラインC標準(n1256ドラフト) に従って:

6.2.5タイプ
...
27 Voidへのポインタは、文字型へのポインタと同じ表現および配置要件を持たなければならない。39)同様に、互換性のある型の修飾されたバージョンまたは修飾されていないバージョンへのポインターは、同じ表現と配置の要件を持たなければなりません。構造体型へのすべてのポインタは、互いに同じ表現と配置の要件を持たなければなりません。共用体型へのすべてのポインタは、互いに同じ表現と配置の要件を持たなければなりません。他の型へのポインターは、同じ表現または配置要件を持つ必要はありません。

システムでvoidポインターとcharポインターのサイズが2になっている理由については、16ビットプラットフォームを使用しているためと考えられます。

6
John Bode

ポインターは、別のものを指すメモリアドレスを格納します。ポインタのサイズはプラットフォームによって異なります。 32ビットプラットフォームでは、メモリアドレスを格納するために32ビットまたは4バイトが必要なので、sizeofポインタは4を返します。

Sizeof(void *)が2の場合、おそらく16ビットプラットフォームで実行されています。

1
Mendelt

JaredParがすでに指摘したように、これはプラットフォームに依存します。別の言い方をすると、使用されているCPUはメモリアドレス指定に何ビットを使用しますか? 16ビットアドレスの場合、サイズは2バイトになります。 16ビットマイクロコントローラーのコードをコンパイルしていますか?

0
S.C. Madsen

ポインタのサイズは、整数のサイズと同じです。 16ビットコンパイラでは2バイト、32ビットコンパイラでは4バイト、64ビットコンパイラでは8バイトにすることができます。

void *ptrint *ptrおよびchar *ptrは同じサイズになりますが、そうするとptr++、対応するポインターは、そこのデータ型に従ってジャンプします。つまり、voidおよびcharの場合は1ポジション。同様に、intの場合は4ポジション。

0
Greety_Tobin