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

时间:2015-10-18 20:42:26

标签: c function-pointers

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

以下是我的工作内容:

test.c的:

Database

lwp.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);
 }

3 个答案:

答案 0 :(得分:2)

您将num作为(void*)42传递,这是一个垃圾指针,然后进行转换和解除引用。传递int变量的地址或(不太便携)将其转换回int

答案 1 :(得分:1)

变化:

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转换为指针值的指针。

答案 2 :(得分:0)

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

不需要在这里进行转换,但是您应该使用函数的地址使其成为函数指针(逻辑,不是吗?)< / p>

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

(它可以在没有运营商地址的情况下工作,这只是为了清晰起见)

下一个问题:

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

如果你真的希望int投放到此处传递的void *,那么它并不会神奇地成为指针 - 所以只需转回int({ {1}})。解除引用它当然会崩溃,为什么(int) num应该是一个有效的指针?

然后在这里:

42

论证应该有类型 void lwp_create( void (*lwpfun)(void *), void *arg){ (*lwpfun)(arg); //Seg faulting } (你之所以提出lwpfun是有原因的,对吗?)...你可以像调用常规一样调用它功能。所以试试这个:

typedef