web-dev-qa-db-ja.com

Cプログラミング:voidポインターをintにキャストしますか?

たとえば、ptrという名前のvoid *があるとします。どのように正確にintを格納するためにptrを使用する必要がありますか?書くのに十分ですか

ptr = (void *)5;

番号5を保存したい場合は?または、それを保存するために何かをmallocする必要がありますか?

20
Tim

_5_をvoidpointerにキャストし、それをptrに割り当てています。

ptrはメモリアドレス0x5を指しています

それが実際にあなたがやろうとしていることであるなら、まあ、ええ、それはうまくいきます。あなたは...おそらくそれをしたくないでしょう。

「intを保存する」と言ったら、_void*_が指すメモリに整数値5を実際に保存する必要があると思います。十分なメモリが割り当てられている限り(sizeof(int))、キャストでそれを行うことができます...

_void *ptr = malloc(sizeof(int));
*((int*)ptr) = 5;

printf("%d\n",*((int*)ptr));
_
34
Brian Roach

これはsizeof(void*) >= sizeof(int)のすべてのプラットフォーム/環境で機能します。あなたはそれに依存することになっているわけではありません。

可能であれば、代わりに共用体を使用する必要があります。

union {
    void *ptr;
    int i;
};

そうすれば、どちらのタイプのデータにも適合するスペースがあり、キャストは必要ありません。 (その中に非ポインター・データが入っている間は、ポインターを逆参照しようとしないでください。)

または、これを行う理由がintを使用してアドレスを格納していた場合は、代わりに size_t intptr_tなので、どのプラットフォームでもポインタ値を保持するのに十分な大きさになります。

3
Boann

ポインタは常にメモリアドレスを指します。したがって、ポインタを使用して変数を保存する場合、そのポインタに保存するのは変数のメモリアドレスです。

0
Jo.Manurung

castで十分です。

0
James