1

両端キューを破棄しようとしていますが、どういうわけかポインターで失敗します。次のコードを作成しました (deque は、deque の最初の要素を指すポインターへのポインターです)。DequeItem は、フィールド next (次の要素へのポインター) と data (void *) を持つ構造体です。

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;
4

2 に答える 2

3

正しいように見えます。アイテムを呼び出すtemp 前にfree()よく読んでください。これは、回避した一般的な初心者の間違いです。

何が問題なのか、おそらく構造体宣言についても、より多くの情報を提供する必要があると思います。

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

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

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

ノート:

  • キャスト表現を簡略化すると読みやすくなります。
  • 文字列に改行 ( '\n') を含めprintf()て、バッファリングの混乱と値の視覚的な分離を回避します。
于 2012-04-25T07:25:52.880 に答える
1

問題は、最初の要素が破棄されていても、deque の最後の要素 (バック要素) のネクスト ポインターが最初の要素 (フロント要素) を指すことでした。設定することでこれを修正しました

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

上記の for ループの前。手伝ってくれてありがとう!

于 2012-04-25T16:50:48.807 に答える