在 C 中初始化包含函数指针的结构
Initializing a struct containing function pointers in C
结构 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) = malloc(sizeof(Box));
将内存分配给 **box
但是后来我尝试通过
给函数指针的参数赋值
(*box)->func1 = (func1)(&p1, &p2);
(*box)->func2 = (func2)(&p3);
运行 这告诉我所有的指针都未声明。显然我对函数指针的工作方式有一些误解,但我不明白我应该如何初始化它们(如果这是写字的话)。我尝试用 (*func1)(*p1, *p2)
、(func1)(p1, p2)
、(*func1)(p1, p2)
、(*func1)(&p1, &p2)
等替换右侧,但它们没有产生任何我能理解的结果。如何正确初始化此结构的函数指针?
如果相关的话,我正在使用 C90。
如果我很好理解
(*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 未定义。
但是 (*box)->func2 = func2;
无法使用您当前的代码,因为 (*box)->func2
和 func2
的签名不对应。您可以将 create_box
的第二个参数更改为 void (*func2)( void *p3)
或修改 struct box 以具有 void (*func2) (const void *);
结构 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) = malloc(sizeof(Box));
**box
但是后来我尝试通过
给函数指针的参数赋值(*box)->func1 = (func1)(&p1, &p2);
(*box)->func2 = (func2)(&p3);
运行 这告诉我所有的指针都未声明。显然我对函数指针的工作方式有一些误解,但我不明白我应该如何初始化它们(如果这是写字的话)。我尝试用 (*func1)(*p1, *p2)
、(func1)(p1, p2)
、(*func1)(p1, p2)
、(*func1)(&p1, &p2)
等替换右侧,但它们没有产生任何我能理解的结果。如何正确初始化此结构的函数指针?
如果相关的话,我正在使用 C90。
如果我很好理解
(*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 未定义。
但是 (*box)->func2 = func2;
无法使用您当前的代码,因为 (*box)->func2
和 func2
的签名不对应。您可以将 create_box
的第二个参数更改为 void (*func2)( void *p3)
或修改 struct box 以具有 void (*func2) (const void *);