我有一堆看起来像
的结构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次?
答案 0 :(得分:2)
NULL
始终具有相同的值:0。
你可以做你想做的事。这样做的方法是将“下一个”指针放在结构的最开头,因此它总是在每个结构的相同位置。
如果你有任何结构而不是单个“next”指针,你应该从中创建一个结构,然后将结构放在每个结构的开头。例如,如果您将使用“prev”和“next”指针创建一个双向链表,我建议使用两个指针创建一个结构。
如果可以简单地释放每个结构,则可以在每个指针上调用free()
函数。如果有时需要运行清理函数,则应该使通用链表清除函数获取指向清理函数的指针,并在列表中到达的每个结构上调用清理。
答案 1 :(得分:0)
您需要遍历整个列表,同时一次释放一个指针。