如何将变量结构类型传递给 C 中的函数

Posted

技术标签:

【中文标题】如何将变量结构类型传递给 C 中的函数【英文标题】:How do I pass a variable struct type to a function in C 【发布时间】: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 可移植运行时中的内存池之类的东西。 【参考方案1】:

不能“让函数采用任何类型的结构”。反正不是直接的。

有一种方法可以解决 C 没有泛型的限制,那就是使用一种继承。

您创建一个 base 结构,其中仅包含 alive 字段:

struct base

    int alive;  // Or whatever type is suitable
;

然后你可以“继承”这个结构。通过将结构本身包含在另一个结构中:

struct child1

    struct base base;
    // Other members...
;

或者将alive 明确作为第一个成员:

struct child2

    int alive;
    // Other members...
;

注意:base 结构或alive 成员是结构中的第一个成员非常重要,否则继承将不起作用。

现在您可以将指向struct base 的指针作为参数传递,并且可以将子结构类型转换为基础,并且您可以访问alive 成员。


使用上面定义的结构的简单示例:

void function(struct base *base)

    printf("alive is %d\n", base->alive);


int main(void)

    struct child1 c1 =  1 ;
    struct child2 c2 =  0 ;

    // Cast to (pointer to) the common base class
    function((struct base *) &c1);
    function((struct base *) &c2);

【讨论】:

我不太明白我们如何将孩子作为基础并访问活动字段???如果我们将结构类型转换为基础,那么它是否会以某种方式进行重组以仅产生否struct base 中包含的字段/成员(无论数据类型如何)??这就是为什么需要首先激活和基本成员以便在类型转换后仍然可以访问它们的原因吗? @EL337_H4XX0R 有一个“通用初始序列”规则,允许我们使用指向不同类型结构的指针访问结构的初始部分,只要它们共享相同的第一个成员。 @EL337_H4XX0R 我现在不在,但稍后会添加示例。 “共享同一个成员”?是目的相同还是数据类型相同,例如 child1 包含与 base 不同的第一个成员的数据类型(即 'base' 而不是 'int' )但有助于服务于相同的目的,所以...? @Someprogrammerdude 没问题的朋友

以上是关于如何将变量结构类型传递给 C 中的函数的主要内容,如果未能解决你的问题,请参考以下文章

如何将不同类型的结构体作为一个函数的参数?

C语言-结构体笔记2

C语言-结构体笔记2

C语言-结构体笔记2

C语言-结构体笔记2

通过 C 中的套接字传递结构