在C中初始化包含函数指针的结构

时间:2019-05-02 15:49:38

标签: c struct function-pointers c89

box中的结构box.h定义如下:

typedef struct box {
    int (*func1) (const void *p1, const void *p2);
    void (*func2) (void *p3);
} Box;

box.c包括box.h并具有以下功能:

int create_box(int (*func1)(const void *p1, const void *p2), void (*func2)(const void *p3), Box **box) {
调用

create_box可以根据提供的参数初始化盒子。我正在努力弄清楚如何将提供的函数指针分配给结构的字段。首先,我首先通过**box

(*box) = malloc(sizeof(Box));分配内存

但是然后我尝试通过分配函数指针的参数

(*box)->func1 = (func1)(&p1, &p2);
(*box)->func2 = (func2)(&p3);

运行此命令可以告诉我所有指针均未声明。显然,我对函数指针的工作方式有误解,但我不明白应该如何初始化它们(如果那是写词)。我尝试用(*func1)(*p1, *p2)(func1)(p1, p2)(*func1)(p1, p2)(*func1)(&p1, &p2)等替换右侧,但是它们没有产生我所能理解的东西。如何正确初始化此结构的函数指针?

如果需要的话,我正在C90工作。

1 个答案:

答案 0 :(得分:6)

如果我很了解

(*box)->func1 = (func1)(&p1, &p2);
(*box)->func2 = (func2)(&p3);

位于int create_box(int (*func1)(const void *p1, const void *p2), void (*func2)(const void *p3), Box **box) {中,因此您想:

(*box)->func1 = func1;
(*box)->func2 = func2;

格式(func1)(&p1, &p2);调用地址为 func1 且其参数为 p1 p2 的函数( func1 周围的“()”是没有用的),这显然不是您想要的,可以做的,因为未定义 p1 p2 。< / p>

但是您的当前代码无法使用(*box)->func2 = func2;,因为(*box)->func2func2的签名不对应。您可以将create_box的第二个参数更改为void (*func2)( void *p3)或修改 struct框以使void (*func2) (const void *);