【问题标题】:How to call a Void function which has a void parameter in C如何在C中调用具有void参数的Void函数
【发布时间】:2014-11-07 15:18:34
【问题描述】:

我是 C 的初学者。 现在我有这样的功能

void mark_function(void *obj, void (*mark_obj)(void *));

据我了解,这是一个 void 函数,它有两个参数,第一个是 void 指针, 第二个是另一个带有 void 参数的 void 函数。

我尝试了很多方法来调用它,但它似乎无法正常工作,要么给我返回分段错误或指针类型不一样的警告。

那么这个函数到底意味着什么?应该传入什么参数?以及如何称呼它? 有什么帮助吗?

非常感谢!

【问题讨论】:

  • 显示您如何尝试调用它。这是查看问题的最简单方法。
  • 这看起来像一个指向函数的指针,它接受一个void 指针并返回void
  • 这不是一个“无效函数”。这是一个没有返回值的函数。它接受两个参数:第一个是任何类型的指针 (*obj) (void) 和一个指向没有返回值的函数的指针 (void (*mark_obj)),它接受一个任何类型的指针 ((void *))。
  • @FatalError 我试过 Void mark_function(head, mark_link_list(start));其中 head 和 start 是不同链接列表的两个开始节点。
  • 不要把参数传给函数指针,只传mark_function(head, mark_link_list)。 (稍后通过指针调用函数时,将提供适当的参数。)如果函数签名不匹配,编译器会告诉你。

标签: c


【解决方案1】:

让我们先说得更清楚。您有一个名为mark_function 的void 函数,它接受2 个参数。第一个参数是 void 指针,第二个参数是指向返回 void 并将 void 指针作为参数的函数的指针。让我们创建一个适合作为参数传递给mark_function的函数。

void param(void *p) {
    // function body
}

假设 ab 是 2 个 void 指针。我不会详细介绍它们的范围,但是您需要注意:它们必须在它们使用的范围内可用。 然后,mark_function 将被称为:

mark_function(a, param);

mark_function 正文中,您可以有类似的内容:

param(b);

,这是对作为参数传递的函数的调用。


长话短说:用作参数的函数指针旨在使需要它们通过调用不同函数来执行不同活动的函数成为可能。指针函数的值只是具有适当签名(返回值和参数列表)的函数的名称。您的函数可以根据需要使用它来调用作为参数提供的函数。

【讨论】:

    【解决方案2】:

    您应该使用一个指向对象的指针和一个指向合适类型的函数的指针来调用函数。

    int my_int;
    
    void mark_function(void *obj, void (*mark_obj)(void *));
    
    void my_func (void *vp)
    {
      /* Convert vp to a pointer to a real type */
      int *ip = vp;
    
      /* Do something with ip or *ip */
    }
    
    mark_function (&my_int, my_func);
    

    指向对象 (&my_int) 的指针可以安全地转换为 void * 并返回相同的类型。结果指针保证与原始指针相同。这允许mark_function() 执行某些任务,而不管指针指向的实际类型如何。

    此类任务的典型示例包括使用调用者提供的自定义比较函数对数组进行排序,或者在不知道存储在其中的对象类型的情况下维护链表,等等。

    【讨论】:

      猜你喜欢
      • 2021-12-15
      • 2020-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-13
      • 2016-07-16
      • 1970-01-01
      相关资源
      最近更新 更多