web-dev-qa-db-ja.com

c:void *のサイズ

私はCのvoid *ポインターと少し混乱しています。特にこの質問を読んだ後は sizeof(some pointer)は常に4に等しいですか? 、一人の人がsizeofの保証はないと言っています(int *)== sizeof(double *)

私の質問は、sizeof(void *)> = sizeof(他のポインタ型)の保証はありますか?言い換えると、常にsome_type *ポインターをvoid *ポインターに割り当て、それをsome_type *として取得できますか?

24
facha

データポインタのみ。 void *は任意のデータポインタを保持できますが、関数ポインタは保持できません。

これが C FAQ です。

void *は、オブジェクト(つまりデータ)ポインタを保持することのみが保証されています。関数ポインタをvoid *型に変換することはできません。 (一部のマシンでは、関数アドレスが非常に大きく、データポインターより大きくなる場合があります。)

最初の部分については、そうです、異なるタイプは 異なるサイズのポインター を持つことができます:

27
cnicutar

ポインタに格納される値は、メモリへのアドレスです。 32ビットシステムを使用している場合、メモリへのポインタは32ビット(または4バイト)の長さになります。 64ビットシステムを使用している場合、メモリへのポインタは64ビット(または8バイト)の長さになります。

メモリ内の場所を保持するデータのサイズは、メモリ内のその場所で表されるデータのサイズとは関係ありません。

char *double *の違いについては、char *は任意の場所を指すことができますが、double *は8バイト境界に沿って何かを指す必要があります。より大きなデータは、使用しているプロセッサのルールに従って調整する必要があります。そのため、小さなデータへのポインタは通常、大きなデータへのポインタと互換性がありません(たとえば、double *ポインタをchar *アドレスにポイントしないでください)。しかし、あなたは他の方向に行くことを節約しています(たとえば、char *ポインタをdouble *アドレスにポイントすることができます)。

10
unpythonic