• 締切済み

voidについて

voidはデータの定義の無い型であり、代入演算子で代入する場合に、データとして参照するvoid型のメモリの領域は、代入先として参照するvoid以外の型のメモリの領域の型に変換されるという事でしょうか。

みんなの回答

回答No.4

void型は、関数の返値がないという意味のことでしか使いません。 ということで、ご質問の内容は、voidポインタ型(void*)のことだと思いますので、そのつもりで回答します。 まず、voidポインタ型の存在意義は、抽象化と私は思っています。 たとえば、memcpy()関数の場合、プロトタイプは、 void *memcpy(void *buf1, const void *buf2, size_t n); です。 もし、おこでvoidポインタ型が存在しないとします。 memcpy()関数は、引数の種類だけ定義しなくてはいけなくなることは分かっていただけますか? intcpy(), charcpy(), longcpy(),..... ってな具合に、構造体のコピーも考えれば無限に関数が必要になります。 これは明らかに不経済です。 そこで、型が決定していない、抽象化したvoidポインタ型が必要になります。 C#でのジェネリック型と似たようなものです。 次に、void*からのキャストですが、実行時には何もやっていません。 キャストが行われたとき、メモリ領域になにか手が加わるというわけではないので、 つまり、「メモリ領域が変換される」という表現は違います。 ポインタというのは、変数のアドレスだというのはご承知かと思います。 たとえば、配列を格納するために、malloc()で領域 "array" を確保したとしましょう。 そして先頭が、0x0100だとしましょう。 配列の先頭は0x0100だとわかります。では次の要素は? voidポインタのままでは、それは分かりません。だって、サイズも何も決めない抽象的な存在ですから。 では、intポインタにキャストしたとします。 2番目のアドレスは何になるでしょう? intのサイズが32bitだったとしたら、0x0104ですね。 ここでの+4バイトの足し算はコンパイラが決めています。 代入についても、同様の理由で型が決まってないとできませんね。 アドレス計算や代入の方法などを、コンパイラが決めるためにキャストしている。 これが、キャストをしないといけないという理由です。

回答No.3

んーと・・・。 たぶんmallocの戻り値がvoid *でこれを例えばint *にキャストして 使用することについての質問だと思うのですが。。。。 違ってたらゴメン。 mallocはvoid型のメモリー領域を確保するわけではありません。 引数に与えられたバイト数のメモリー領域を確保するだけでデータ型は規定されません。 戻り値がvoid *なのはvoid *が汎用ポインタと言って、どのポインタ型にもキャストできるからです。 確保された領域をどの型で利用するかは自由です。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

文章の意味が分かりません. 具体的な例は出せますか?

  • morchin
  • ベストアンサー率16% (212/1281)
回答No.1

void型の変数は存在できないと思いますが、仮に出来ても、他の型に代入するとコンパイル時エラーが発生すると思いますが…。例えば、void*型など。

関連するQ&A