たとえば、ptrという名前のvoid *があるとします。どのように正確にintを格納するためにptrを使用する必要がありますか?書くのに十分ですか
ptr = (void *)5;
番号5を保存したい場合は?または、それを保存するために何かをmallocする必要がありますか?
_5
_をvoidpointerにキャストし、それをptr
に割り当てています。
今ptrはメモリアドレス0x5を指しています
それが実際にあなたがやろうとしていることであるなら、まあ、ええ、それはうまくいきます。あなたは...おそらくそれをしたくないでしょう。
「intを保存する」と言ったら、_void*
_が指すメモリに整数値5を実際に保存する必要があると思います。十分なメモリが割り当てられている限り(sizeof(int)
)、キャストでそれを行うことができます...
_void *ptr = malloc(sizeof(int));
*((int*)ptr) = 5;
printf("%d\n",*((int*)ptr));
_
これはsizeof(void*) >= sizeof(int)
のすべてのプラットフォーム/環境で機能します。あなたはそれに依存することになっているわけではありません。
可能であれば、代わりに共用体を使用する必要があります。
union {
void *ptr;
int i;
};
そうすれば、どちらのタイプのデータにも適合するスペースがあり、キャストは必要ありません。 (その中に非ポインター・データが入っている間は、ポインターを逆参照しようとしないでください。)
または、これを行う理由がintを使用してアドレスを格納していた場合は、代わりに size_t
intptr_t
なので、どのプラットフォームでもポインタ値を保持するのに十分な大きさになります。
ポインタは常にメモリアドレスを指します。したがって、ポインタを使用して変数を保存する場合、そのポインタに保存するのは変数のメモリアドレスです。
cast
で十分です。