【发布时间】:2021-08-28 04:32:56
【问题描述】:
我想创建一个fire and forget函数来处理链表的所有元素所持有的内存空间。它需要三个参数,一个指向结构的指针(我希望它是变量类型),它充当列表头,指向此结构中没有元素的指针,以及一个布尔标志,指定是否释放所有元素持有的内存或仅释放“alive”为假的内存。如果未指定此标志,则只有删除了alive字段设置为false的元素。它还删除了从列表中释放的结构元素。代码如下:
1 void clean_list(node* node_null,int* nr_elements_ptr,bool free_everything){
2 node* prev=node_null;
3 node* curr=node_null;
4 node* nxt=node_null->next;
5 int itr= *nr_elements_ptr;
6 for(int i=0;i<itr;i++){
7 curr=nxt;
8 if(prev->next!=nxt)
9 prev=prev->next;
10 if(i!=itr-1)
11 nxt=nxt->next;
12 if(!(curr->alive) || free_everything){
13 if(i!=itr-1)
14 prev->next=nxt;
15 else prev->next=NULL;
16 free(curr);
17 *nr_elements_ptr-=1;
18 }
19 }
20
21 }
我的问题是,我怎样才能使函数采用任何类型的结构(假设它包含一个“活动”字段),而不仅仅是“节点”类型定义,以便它对我的其他程序有用。如果有人已经有类似的问题,请原谅我的无知并将我指向相应的链接。谢谢。
【问题讨论】:
-
究竟什么是“任何类型的结构(假设它包含一个 'alive' 字段)”?这不是“任何类型”,这是一种非常具体的类型。
-
如果我在另一个程序中定义另一个结构,不一定定义为 typedef 节点并将其传递给这个函数
-
对于未来的问题,请不要在您的代码 sn-ps 中包含行号。
-
这是一个非常奇怪的要求。最简单的方法是创建一个节点,该节点又包含类似
void*的数据。 -
这听起来像是你想要一些方便的图书馆来记录记忆等。考虑使用 Apache 可移植运行时中的内存池之类的东西。
标签: c function variables struct arguments