【问题标题】:Deallocating dynamically linked list of struct in C在C中释放结构的动态链接列表
【发布时间】:2013-03-05 22:09:15
【问题描述】:

我有一堆看起来都像的结构

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 次?

【问题讨论】:

    标签: c linked-list memory-management


    【解决方案1】:

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

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

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

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

    【讨论】:

    • Null 仅在编译时为 0,它在运行时取决于实现(AFAIK)。所有next 指针都在struct 的开头。
    • NULL 合法值的讨论:stackoverflow.com/questions/2599207/… 但根据我的经验,我从未见过 NULL 是 0 以外的任何值。这包括 Windows、Mac、Linux 和嵌入式。而且,有 大量 代码可以执行 while (ptr->next) { do_something(ptr); ptr = ptr->next } 之类的操作,非零 NULL 会破坏所有代码,因此我认为任何平台都不太可能不符合常规使 NULL 为 0 的做法。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-07-25
      • 1970-01-01
      • 1970-01-01
      • 2015-10-20
      • 1970-01-01
      • 2020-07-17
      • 2022-12-04
      • 1970-01-01
      • 2018-05-17
      相关资源
      最近更新 更多