所以我似乎无法让这个简单的函数指针在没有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);
}
答案 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);
您的第一个表单不会传递指向int
值42
的对象的指针,而是指向将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