3

リンクされたリストを使用して構造を埋めていますが、構造全体を削除してリンクされたリストの内容を印刷しようとすると (null である必要があります)、数字のリストが表示されます。おそらくメモリの問題であることはわかっています。それを修正する方法の提案はありますか?

リンクされたリスト全体を削除するためのコード:

void destroy(set_elem *head)
{
    set_elem *current = head;
    set_elem *next;

    while (current != NULL)
    {
       next = current->next;
       free(current);
       current = next;
    }
    head = NULL;
}
4

4 に答える 4

2

削除関数は正しく機能しますが、ローカルポインターのみを変更しているため、呼び出し元のヘッドを NULL に設定しません。これによりhead = NULL;、後のロジックで値を確認して値を出力しようとします。head.

元のポインターを変更するには、ポインターを渡してhead設定します*head=NULL;

void destroy(set_elem **head)
{
set_elem *current = *head;

/* rest is the same */

*head = NULL;
}
于 2013-10-19T21:46:22.397 に答える
1

元のヘッドを変更していません。このヘッドへのポインター、つまりポインターへのポインターを渡すか、変更されたヘッドを呼び出し元に返す必要があります。以下は、変更されたヘッドを呼び出し元に返すコードです。ポインターからポインターへのアプローチを示す他の回答があります。

  set_elem* destroy(set_elem *head) {
      set_elem *current = head;
     set_elem *next;

     while (current != NULL) {
         next = current->next;
         free(current);
         current = next;
     }
     head = NULL;
     return head;
   }

呼び出し元で、

    head = destroy(head);
于 2013-10-19T22:24:49.587 に答える
0

ローカルheadポインターのみを変更しています

ダブルポインターを使用して を変更しますhead。これは後で印刷/処理に使用されます

void destroy(set_elem** head)
{

   set_elem* current = *head;
   set_elem* next;

   while (current != NULL)
   {
       next = current->next;
       free(current);
       current = next;
   }

   *head = NULL;
}
于 2013-10-19T21:48:45.743 に答える