c - 函数指针不兼容的指针类型 void (*)(void *) from void (my_type *)

标签 c pointers struct function-pointers

我收到上述警告并理解它,但就是不知道如何解决它。我的代码在下面,但基本上我所做的是在结构中存储一个函数指针,并在我从 main.c 调用的另一个函数中初始化该结构。当我将代码与默认函数(即 free())一起使用时,代码似乎可以编译,但当我将它与下面的 test_func 函数一起使用时,代码似乎无法编译。想法?

结构:

  typedef struct my_struct {
  my_type **double_pointed;
  int num;
  void (*funcp)(void *data);
  } my_struct_t;

初始化函数:

my_struct_t *init(int num, void (*my_funcp)(void *data)) {

    // unimportant code to the problem, but basically just some mallocs for the other data

  my_struct_t *my_str;
  my_str->funcp = my_funcp;

  return struct;
}

我要指向的函数:

void desired_func(my_type *obj) {}

我对初始化函数的调用:

init(5, desired_func);

完整错误:

分配给 'void (*)(void *)' 的不兼容指针类型 '无效(我的类型 *)'

在上面的初始化函数中的一行:

my_struct_t *my_str;
my_str->funcp = my_funcp;

最佳答案

更改函数指针类型以匹配函数,即。 :

void (*funcp)(my_type *data);

如果您希望能够使用具有不同签名的函数(例如,不同的参数类型),您可以添加显式转换。例如:

init(5, (void (*)(void*)) desired_func);

请注意,任何时候 desired_func函数(或签名与 funcp 函数指针不匹配的任何其他函数)需要通过函数指针调用,函数指针必须转换回其原始类型(在本例中为 void (*)(my_type*))调用函数,或者调用未定义的行为。

另一种(更好一些)替代方法是更改​​ desired_func像这样的定义:

void desired_func(void *vobj) {
    my_type* obj = vobj;
    /* rest of the code */
}

注意调用desired_func时(通过函数指针或直接),其地址作为参数传递的对象的类型需要是my_type , 或取消引用 obj在函数内部(如果对齐方式不同甚至转换本身)将调用未定义的行为。

在转换时处理潜在未定义行为的额外复杂性(如上所述)意味着我建议不要转换 - 需要这样的转换可能表明您的设计存在问题。 IE。如果您多考虑一下您的要求,可能会有更好的解决方案。

关于c - 函数指针不兼容的指针类型 void (*)(void *) from void (my_type *),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38474800/

相关文章:

c++ - 免费(指针)方法的性能?

c - C 中的内存分配器——如何利用 sbrk() 的空间

java - Java 与 C 中的字符大小

c - 将读取缓冲区内容存储在字符串中

sqlite3,通过索引检索行元素的最佳方法?

c++ - 为什么在链表中使用指向结构的指针而不是常规的结构类型变量?

c++ - 指向结构 C++ 中的 vector 的指针

c - scanf 后出现段错误?

c - 如何克服 Stack Smashing 错误?

c - 指向结构的指针成员