5

私はファイルをコピーするプログラムを書いています。read()関数が提供する情報を格納し、このデータを関数に提供するために、バッファーを使用しましたwrite()。私はこの宣言を使用しました:

static void buffer[BUFFER_SIZE];

問題は、エラーが発生することerror: declaration of ‘buffer’ as array of voidsです。

voidの配列を宣言することがエラーである理由がわかりません。特定のタイプなしでメモリのブロックを宣言するにはどうすればよいですか?

4

5 に答える 5

13

voidの配列を宣言することがエラーである理由がわかりません。

voidarray-of-を宣言できない技術的な理由voidは、完了できない不完全な型であるためです。配列要素のサイズは既知である必要がありますが、void型にはサイズがありません。同様に、次のようにvoidオブジェクトを宣言できないことに注意してください。

void foo;

voidへのポインタには特定のサイズがあることに注意してください。これが理由です。

void *foo;

は有効ですが、sizeof(foo)無効sizeof(*foo)になります。

特定のタイプなしでメモリのブロックを宣言するにはどうすればよいですか?

汎用メモリバッファの場合は、プレーンcharまたはunsigned char(またはuint8_t)の配列を使用します。 配列が互換性のないポインターに関する診断につながる関数charのファミリーにポインターを渡す必要がある場合、私は通常プレーンを好みます。str*unsigned char

于 2012-04-27T08:36:25.710 に答える
5

charまたはの配列をunsigned char代わりに使用してください。

于 2012-04-27T08:20:00.780 に答える
2

配列を宣言するとき、コンパイラは配列のサイズを知っている必要があります。voidタイプにはサイズがありません。したがって、コンパイラはエラーを報告します。

于 2012-04-27T08:26:41.537 に答える
1

これがあなたのやり方です。あなたが望んでいたようなvoidの配列ではありませんが、voidポインタの配列です。このvoidポインタの各セルで、何でも割り当てることができます。

変数を格納したい場合は、それを(void*)にキャストするだけです。例を次に示します。

void *XPoint[5] = { 0 };
XPoint[0] = (void*)5;   // int
XPoint[1] = "Olololo!"; // char*
XPoint[2] = (void*)'x'; // char
XPoint[3] = (void*)structA.nNum; // struct int 
于 2014-03-16T21:55:28.940 に答える
-1

voidポインタを宣言することもできます。

void* buffer;

// just pointers for simple work with allocated piece of memory
char* chBuf;
long* intBuf;

次に、このポインタにmalloc()を使用し、任意の配列(char、short、long、float、double、または独自の型)と同様に、このメモリを操作します。この場合、メモリリークを回避するためにfree()を使用することを忘れないでください。

buffer = malloc (BUFFER_SIZE);
if (buffer==NULL)
  exit (1);

// init our buffers
chBuf=(*char)buffer;
intBuf=(*long)buffer;
于 2012-04-27T08:23:32.540 に答える