调用传递给另一个函数的函数指针
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);
您的第一种形式不会传递指向具有 int
值 42
的对象的指针,而是通过将 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);
}
所以我似乎无法在没有段错误的情况下将这个简单的函数指针指向 运行
这是我正在使用的东西:
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);
您的第一种形式不会传递指向具有 int
值 42
的对象的指针,而是通过将 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);
}