在C中释放动态链接的struct列表

时间:2013-03-05 22:09:15

标签: c linked-list memory-management

我有一堆看起来像

的结构
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次?

2 个答案:

答案 0 :(得分:2)

NULL始终具有相同的值:0。

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

如果你有任何结构而不是单个“next”指针,你应该从中创建一个结构,然后将结构放在每个结构的开头。例如,如果您将使用“prev”和“next”指针创建一个双向链表,我建议使用两个指针创建一个结构。

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

答案 1 :(得分:0)

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