调用传递给另一个函数的函数指针

Calling a function pointer passed to another function

所以我似乎无法在没有段错误的情况下将这个简单的函数指针指向 运行

这是我正在使用的东西:

test.c:

 #include <stdint.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
 #include <unistd.h>

 typedef void (*lwpfun)(void *);     
 static void indentnum(void * num);

 int main(int argc, char *argv[]){
    lwp_create((lwpfun)indentnum,(void*)42); 

    return 0;
 }

 static void indentnum(void *num) {
    printf("Indent num: %d\n", *(int *)num);
 }

lwp.c

 #include "stdio.h"
 #include <stdlib.h>

 void lwp_create( void (*lwpfun)(void *), void *arg){
    (*lwpfun)(arg); //Seg faulting
 }

变化:

lwp_create((lwpfun)indentnum,(void*)42);

至:

lwp_create(indentnum, &(int []){42});  // use of a C99 compound literal

或者在 C89 中:

int x = 42;
lwp_create(indentnum, &x);

您的第一种形式不会传递指向具有 int42 的对象的指针,而是通过将 42 转换为指针值而形成的指针。

您将 num 作为 (void*)42 传递,这是一个垃圾指针,然后对其进行强制转换和取消引用。要么传递 int 变量的地址,要么(不太便携)将其转换回 int.

lwp_create((lwpfun)indentnum,(void*)42); 

这里不需要强制转换,但是你应该把你的函数的地址变成一个函数指针(合乎逻辑,是不是吗?)

lwp_create(&indentnum,(void*)42); 

(没有操作员地址也能工作,这只是为了清楚)

下一个问题在这里:

 static void indentnum(void *num) {
    printf("Indent num: %d\n", *(int *)num);
 }

如果您真的想将 int 强制转换为此处传递的 void *,这并不能使它神奇地成为指针——所以只需强制转换回 int(int) num).取消引用它当然会崩溃,为什么 42 应该是一个有效的指针?

然后这里:

 void lwp_create( void (*lwpfun)(void *), void *arg){
    (*lwpfun)(arg); //Seg faulting
 }

参数应该有 type lwpfun(你做那个 typedef 是有原因的,对吧?)...你可以直接调用它就像您调用常规函数一样。所以试试这个:

 void lwp_create(lwpfun callback, void *arg){
    callback(arg);
 }