尽管如此,我仍然提供了具体的例子。我有一个typedef(来自头文件maplec.h
定义OpenMaple)。
typedef struct {
void (M_DECL *textCallBack) ( void *data, int tag, char *output );
void (M_DECL *errorCallBack) ( void *data, M_INT offset, char *msg );
...
} MCallBackVectorDesc, *MCallBackVector;
在我的代码中,我想分配要使用的回调函数。在手册(http://www.maplesoft.com/applications/view.aspx?SID=4383&view=html)的示例中,这是通过
完成的MCallBackVectorDesc cb = { textCallBack,
0, /* errorCallBack not used */
...
};
但是我想在我定义为
的结构中保留对此变量cb
的引用
struct open_maple {
MCallBackVectorDesc *call_back_vector;
};
然后我用
初始化open_maple->call_back_vector = (MCallBackVectorDesc *)malloc((size_t)sizeof(MCallBackVectorDesc));
(open_maple->call_back_vector)->textCallBack = &textCallBack;
(open_maple->call_back_vector)->errorCallBack = 0;
此代码不会产生任何编译器警告或Segfaults,但我似乎也没有接收任何textCallBack调用,而在线示例版本可以工作。我尝试了其他定义和作业,但总是收到警告或Segfaults。
归结为一个问题:如果我不想在初始化时(在变量cb的声明中)分配它们,如何正确地将指针分配给在typedef结构中收集的回调函数?
修改1
以下建议发生错误,因为我将textCallBack
函数称为&textCallBack
函数,该函数从指针生成指针。但是,该示例既不适用也不适用于&
。另请注意,以下代码有效:
/* some standard libraries */
#include <stdlib.h>
#include <stdio.h>
void function(void){
printf("IAMHERE\n");
};
int main()
{
void (*myfunction)(void) = &function;
myfunction();
return 0;
}
我正在使用gcc -o test test.c
来编译它。
修改2
更多的调查显示该问题与我使用OpenMaple有关。
答案 0 :(得分:-1)
textCallBack被定义为指向函数的指针。
你正在获取它的地址 - 指向函数指针的指针。
这真的是你打算存储在你的结构中吗?