2012-04-25 12 views
1

私はデキューを破壊しようとしていますが、何とかポインタで失敗します。私は次のコードを書いています(両端キューは、両端キューの最初の要素を指すポインタへのポインタです)。 DequeItemは次のフィールド(次の要素へのポインタ)とデータ(void *)を持つ構造体です。ポインタを使用してdequeとC言語でフリー

void deque_destroy(DequeItem **deque) { 
    DequeItem *temp; 
    DequeItem *item; 
    for (item = *deque; item != NULL; item = temp) { 
     printf("%d", *((int*)((item)->data))); 
     temp = item->next; 
     free(item); 
    } 
} 

構造体宣言は次のとおりです。

struct DequeItem { 
    void *data;     // Data stored in the deque item 

    struct DequeItem *previous; // Pointer to the previous DequeItem in the ring 
    struct DequeItem *next;  // Pointer to the next DequeItem in the ring 
}; 

typedef struct DequeItem DequeItem; 
+0

それでは、正確には何が動作していませんか? –

+0

セグメント違反が発生します。理由:プログラムが受信した信号EXC_BAD_ACCESS、メモリにアクセスできない 理由:13のアドレス:0x0000000000000000だから、私はヌルポインタを持っていますか? – rize

+0

セグメンテーションフォルトは、 forループのため、printf()。 – rize

答えて

1

問題は、最初の要素が破棄されているにもかかわらず、両端キューの最後の要素(後部要素)の次のポインタが最初の要素(前部要素)を指してしまうという問題でした。上記のforループの前に、設定してこの問題を修正しました。

(*deque)->previous->next = NULL 

手伝ってくれてありがとう!

+0

を取得します。つまり、最後の要素のnextポインタはNULL以外です。ループは最後の要素に到達し、以前にフロント要素を含んでいたアドレスでメモリを解放しようとします。 – rize

3

がうまく前tempを読み出すために行われ、正しい見えるアイテムにfree()を呼び出し、それはあなたが避けてきた一般的な初心者の間違いです。

私は、何がうまくいかないか、おそらくは構造体宣言についての詳細な情報を提供する必要があると思います。

dataメンバーも動的にメモリを割り当てられていますか?その場合は、アイテムが作成されたときの割り当て方法によってもfree(item->data);コールが必要になることがあります。

コメンターが指摘したように、あなたのdataポインタはNULLかもしれないので、あなたは印刷する前に、それをチェックする必要があります

if(item->data != NULL) 
    printf("%d\n", *(int *) item->data); 

注:鋳造式の

  • Simplificationを読みやすくすることができます。
  • printf()文字列に改行を含めると、混乱のバッファリングや値の視覚的分離を避けることができます。
関連する問題