0

私はポインターと C の考え方に比較的慣れていないので、これが本当に単純な問題である場合は申し訳ありません。作成されたメモリから単一リンク リストを解放しようとしています。個別のリストは正常に作成されていますが、メモリから解放するのに問題があり、セグメンテーション違反が発生します。私が間違っているアイデアはありますか?freelist と freenode の両方に別々のメソッドが必要です。Avail はグローバル ポインター変数であり、確実に機能するコードの一部です。問題は空きリストにあり、どこにあるのかわかりません。

   void freelist(olnode **list) {
   olnode *ptr = *list;
    while (*list != NULL) {
     ptr = *list
     freenode(&ptr);
     ptr = ptr->next;
    }
   }

   void freenode(olnode **ptr) {
    if(*ptr != NULL) {
     (*ptr)->next = avail;
     avail = *ptr;
     *ptr = NULL:
    }
   }
4

2 に答える 2

3

Freenode は、渡されたポインタを NULL に設定します。その後、freelist は現在 null になっているポインターを逆参照しようとします。そこでプログラムがクラッシュします。

それに加えて、あなたのプログラムは実際にはデータを解放しません。データを指すポインターを NULL を指すように変更するだけです。つまり、メモリは割り当てられたままになり、新しいデータには使用できません。ポインターが指すメモリーを不要としてマークするには、それを指すポインターで標準ライブラリーからfree()メソッドを呼び出す必要があります。後でポインターを NULL に設定する必要はありませんが、解放されたメモリーの場所にその後アクセスしようとすると、予測可能なクラッシュが発生し、完全に予測不可能な動作が発生しないようにするための良い方法です。

于 2012-09-18T23:33:59.423 に答える
1

nextノードを解放する前に、ノードからポインターを取得する必要があります。

これではない:

 freenode(&ptr);
 ptr = ptr->next;

でもこれは:

 olnode *next = ptr->next;
 freenode(&ptr);
 ptr = next;
于 2012-09-18T23:30:43.253 に答える