use*_*168 0 c struct function-pointers c89
结构box
的定义box.h
如下:
typedef struct box {
int (*func1) (const void *p1, const void *p2);
void (*func2) (void *p3);
} Box;
Run Code Online (Sandbox Code Playgroud)
box.c
包括box.h
并具有以下功能:
int create_box(int (*func1)(const void *p1, const void *p2), void (*func2)(const void *p3), Box **box) {
Run Code Online (Sandbox Code Playgroud)
create_box
根据提供的参数被调用以初始化一个盒子。我正在努力弄清楚如何将提供的函数指针分配给结构的字段。首先,我首先通过分配内存给**box
via(*box) = malloc(sizeof(Box));
但是,然后我尝试通过分配函数指针的参数
(*box)->func1 = (func1)(&p1, &p2);
(*box)->func2 = (func2)(&p3);
Run Code Online (Sandbox Code Playgroud)
运行此命令将告诉我所有指针均未声明。显然,我对函数指针的工作方式有误解,但是我不明白我应该如何初始化它们(如果这就是写词)。我试着更换右侧(*func1)(*p1, *p2)
,(func1)(p1, p2)
,(*func1)(p1, p2)
,(*func1)(&p1, &p2)
,等但他们没有得到任何东西,我能理解。如何正确初始化此结构的函数指针?
如果相关的话,我正在C90工作。
如果我很好理解
(*box)->func1 = (func1)(&p1, &p2);
(*box)->func2 = (func2)(&p3);
Run Code Online (Sandbox Code Playgroud)
在,int create_box(int (*func1)(const void *p1, const void *p2), void (*func2)(const void *p3), Box **box) {
所以您想要:
(*box)->func1 = func1;
(*box)->func2 = func2;
Run Code Online (Sandbox Code Playgroud)
该窗体(func1)(&p1, &p2);
调用参数为func1的函数,并在参数中带有p1和p2的地址(func1周围的“()” 无用),这显然不是您想要的,可以做的,因为未定义p1和p2。
但是,(*box)->func2 = func2;
不可能与您现有的代码,因为签名(*box)->func2
和func2
不对应。您可以将第二个参数更改create_box
为void (*func2)( void *p3)
或修改结构框以使其具有void (*func2) (const void *);