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。

你可以做你想做的。这样做的方法是将“下一个”指针放在结构的最开头,因此对于每个结构来说它总是在同一个位置。

如果你有比单个“next”指针更多的结构,你可能应该用它制作一个结构,然后将结构放在每个结构的开头。例如,如果您将使用“prev”和“next”指针创建一个双向链表,我建议使用这两个指针创建一个结构。

如果可以简单地释放每个结构,则只需free()在每个指针上调用该函数。如果你有时需要运行一个清理函数,你应该让你的通用链表释放函数获取一个指向清理函数的指针,并在每个结构体在列表中到达时调用清理函数。

于 2013-03-05T22:12:54.750 回答
0

您需要遍历整个列表,同时一次释放一个指针。

于 2013-03-06T02:14:50.760 回答