![](/img/trans.png)
[英]What is the right way of creating and initializing a struct containing a function pointer in C?
[英]Initializing a struct containing function pointers in C
struct box
在box.h
box
定义如下:
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) = 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工作。
如果我很好理解
(*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)
或将结构框修改为具有void (*func2) (const void *);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.