![](/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.