2012-03-01 3 views
0

void *で指される値をvoid *配列に代入しようとしています。このコンパイラエラーでc、void *が指し示す値をvoid * arrayに代入する

23 void queue_enqueue(void *q, void *item) { 
24 int len = 0 ; 
25 
26 len = sizeof(q) ; 
27 q[len-1] = 
28  item ; 
29  
30 return ; 
31 
32 } 

myqueue.c:27: warning: dereferencing ‘void *’ pointer 
myqueue.c:28: error: invalid use of void expression 

私は今時間ほどの答えを探してきたが、私は同様の実装を見ていないここで私がこれまで持っているものです私がここに与えたものまで。あなたが疑問に思っていた場合は、これは宿題であり、プロトタイプはインストラクターによって与えられました。

voidとして渡されるため、gcc typeof演算子を使用できませんでした。

私は警告で大丈夫です。私はあなたに "これをチェックするつもりはない"と私に言っているgccだと知っていますが、28行目のエラーを取り除くことはできません。

ありがとうございます。

void*の配列ではありません
+0

好奇心の高まりから、なぜこれをやりたいのですか? –

+0

'sizeof'は配列の要素の数ではなく、ポインタのサイズを与えることを知っていますか? – asaelr

+0

@Calvin - キューを作成してデータの冗長性を排除するために、データ型を保持できるようにしています – FatAdama

答えて

3

、それは(実際には存在しない)voidの配列だ、とあなたがに割り当てることができませんので、それはあなたの「本当のないタイプが」void、取得逆参照しますそれ。

あなたがvoid*の配列で動作するようにしようとしている場合は、

void queue_enqueue(void** q, void* item) 

または

void queue_enqueue(void* q[], void* item) // same as above 

に変更しても、あなたのプログラムは、すべての

q[sizeof(void**) - 1] = item; 

を行いますことを実現します時間。 sizeofは、配列ではなくポインタ型のサイズを指定します。配列の長さを知りたい場合は、配列の長さを別の引数として渡す必要があります。

+0

使用時: char * c; c = malloc(10); 個々の要素にアクセスできます。私はそのように作成しました: void * myqueue; myqueue =(void **)malloc(n); そして、私は配列のように個々の要素にアクセスすることができると考えました。教授は私たちに以下の.hファイル(私たちは使用する必要があります)を与えました。: void * queue_new(int numItems); void queue_enqueue(void * q、void * item); void * queue_dequeue(void * q); int queue_isEmpty(void * q); – FatAdama

+0

@ user1042739これは本当に疑わしい関数プロトタイプです。たとえば、ポインタだけでキューが空であるかどうか知るはずです。私はあなたの教授に、これがどのように機能するのかについての詳細を尋ねるでしょう。また、 'void **)malloc(n)'を実行することはできません。これは 'void'へのポインタのポインタになります。 'char's。 –

1

あなたはvoid*の配列を必要とする:

void queue_enqueue(void *q[], void *item) 
0

ボイドが無いサイズのタイプです。 したがって、voidの配列は存在できません。 (配列はユニットの量を定義してからsizeof()演算子を使用してジャンプするためです)

void *を実際にそこに格納されているものと同じ大きさのものにキャストする必要がありますTは、コンパイラがあなたをすることができます実数型になりますので、あなたは、同じサイズのあるタイプT、(私は同じことを言っていないよ)、

T* q2 = (T*)q; 
T* item2 = (T*)item; 
q2[len-1] = &item; 

Cを参照することにより、ポインタを渡すので、これは動作します。
を持っていますそれは
Tは実際の格納値と同じサイズであるため、正しい値格納場所になるでしょう。

void *は配列として、void型の配列へのポインタを含むことに注意してください。 void *は単一の値として単一の値のvoidを含みます。

+0

また、長さは、次のように指定します。len = sizeof(&q)/ sizeof(T); –

関連する問題