如何正确地将函数指针分配给typedef结构的元素

时间:2014-02-08 02:05:16

标签: c pointers struct maple

尽管如此,我仍然提供了具体的例子。我有一个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有关。

1 个答案:

答案 0 :(得分:-1)

textCallBack被定义为指向函数的指针。

你正在获取它的地址 - 指向函数指针的指针。

这真的是你打算存储在你的结构中吗?