3

私はすべてのように見える構造の束を持っています

typedef struct {
  A[1..100] *next; // this is not an array, just indicating A1 or A2 or A3 and so on
  //other stuff that varies from struct to struct
} A[1..100] // A1, A2, and so on

異なる同じタイプの構造のリンクリストをいくつか生成します。関数のどこかに、次のようなメモリを割り当てます

A55 *struct_list;
A55 *next_in_list;

struct_list = (A55 *)malloc(sizeof(A55));
(*struct_list).next = NULL;

//some loop
  next_in_list = (A55 *)malloc(sizeof(A55));
  (*next_in_list).next = struct_list;
  struct_list = next_in_list;

ループstruct_listの最後には、リンクリストの最後へのポインタがあります。

リストに入力する構造に関係なく、リストを解放する単一の関数が必要です。次のことがうまくいくと思いますが、ルールに違反せず、実装が安全である可能性のあるものが必要です。

void freeStruct(*void start){

     void ** current, * next;
     current = (void **) start;

     do{
       next = *current;
       free(current);
       current = (void **) next;
     }while(current != NULL)
    }

私の質問は、NULLが、を含むすべての型へのすべてのポインタに対して同じ数値を持っているかどうかstructです。そして、異なるstruct定義に対して同じ関数を100回コピーする必要なしに、これを行うためのより良い方法はありますか?

4

2 に答える 2

2

NULL常に同じ値:0。

あなたがやりたいことができます。これを行う方法は、構造体の最初に「次の」ポインタを置くことです。これにより、各構造体の同じ場所に常に配置されます。

単一の「次の」ポインタよりも多くの構造体がある場合は、おそらくそのすべてから構造体を作成してから、各構造体の先頭に構造体を配置する必要があります。たとえば、「prev」と「next」の両方のポインタを使用して二重リンクリストを作成する場合は、2つのポインタを使用して構造体を作成することをお勧めします。

各構造体を単純に解放できる場合は、free()各ポインターで関数を呼び出すだけです。クリーンアップ関数を実行する必要がある場合は、ユニバーサルリンクリスト解放関数にクリーンアップ関数へのポインターを取得させ、リストに到達したときに各構造体でクリーンアップを呼び出す必要があります。

于 2013-03-05T22:12:54.750 に答える
0

ポインタを一度に1つずつ解放しながら、リスト全体をトラバースする必要があります。

于 2013-03-06T02:14:50.760 に答える