2011-06-17 6 views
2

私は、データへのポインタを格納するためにC(Linked Listを使用)でQueueを実装しようとしています。 en-queuingは正常に動作しているようですが、de-queuing時のポインタに関するいくつかの問題があります。C pointer shenanigans

void* data = malloc(sizeof(int)); 
dequeue(&Q, data); 
printf("(%d) %d\n", k, *(int*)data); 

デキュー()::私のメイン()で

は私のデバッグに基づき

int dequeue(struct queue *q, void *value) 
{ 
    struct queue_node *tmp; 

    if (!q->first) { 
     value = 0; 
     return 1; 
    } 
    value = q->first->data; 
    tmp = q->first; 
    if (q->first == q->last) 
     q->first = q->last = NULL; 
    else 
     q->first = q->first->next; 

    free(tmp); 
    return 0; 
} 

、それが思われるループのメインで*データポインタの値() dequeue()に設定されている値は保持されません。私は何が欠けていますか?

編集:

struct queue_node 
{ 
    struct queue_node *next;  
    void* data; 
}; 

struct queue 
{ 
    struct queue_node *first; 
    struct queue_node *last; 
}; 
+0

あなたの 'queue'と' queue_node'構造の定義を共有するのに気をつけてください、あるいはその質問のゲームの一部でしょうか? _Update_:ありがとう! –

+0

また、なぜあなたは 'free(tmp)'をしますか?それがmalloc()のメモリへの有効なポインタであることを保証できますか? –

+0

以下の答えのように、結果を適切なものに割り当てることはできません。あなたは 'void *'を返そうとするので、あなたの引数は 'void ** pp'でなければならず、' * pp = q-> first-> data'を割り当てます。 –

答えて

3

queue_nodedataは、この値があったため、いくつかの値へのポインタ(ここではそれがintですが、それがそうでなければあなたの代わりにintを使用したい、常に真ではないかもしれない...)

を保持していますmallocで割り当てられ(ローカル変数ではありません)、ある時点でそれを解放する必要があります。だから、

void**を受け入れるために、関数のシグネチャを変更、main()intに領域を割り当てるが、void * data = 0パラメータとして&datadequeueを呼び出すことはありません。完了したらfreeのデータを忘れないでください。 dequeueには、*value = q->first->dataと設定します。

+0

素晴らしいです、ありがとう! – Alexei

+0

@Alexei:答えをテストしてそれを受け入れることを忘れないでください;) – Andrei

3

あなたが関数にローカルポインタである「値」変数の値を設定しています。

あなたはそれが指し示すための値を設定したい場合は、使用:

*value = 0; 

と:

*value = q->first->data; 

編集(質問編集後):queue_node.dataは、それ自体であるので、上記の@Andreiの注記のように、void **を渡す方が合理的です。

+0

q-> first-> dataはポインタです、* valueは何ですか? – Andrei

+0

@Andrei、これは編集前に投稿され、queue_nodeの定義を示しています。キャストに基づいて、私は 'data'メンバーがintであると推測していました。 –

+0

答えを編集しないと、システムはdownvoteを削除させません。 – Andrei

0

(ボイド*)データをされると仮定して、(int型)値は、データが指すたい、あなたは

*(int *)value = *(int *)q->first->data;

value = q->first->data;

を交換する必要があります関数deque()の中で。

+0

dequeue()関数では、指しているデータ型が分かりません – Alexei

+0

@Andreiは質問を更新したので、正しい答えがあります。 – jman

関連する問題