在struct - C编译器中使用函数指针

时间:2014-02-13 05:40:47

标签: c function pointers struct

我找到了如何在struct中创建函数指针的答案,但我仍然很好奇 它的运作。任何人都能清楚地解释清楚吗?

这是我的问题,

此代码运行正常但是......

char func_1(void);    
char func_2(char);

struct mStruct
{
    char name[100]; 
    int age;
    char (*func_1)(void);
    void (*func_2)(char);
};

void init_struct(struct mStruct *pStruct)<-why this void function is necessary? 
{
    if(pStruct == NULL) {
        pStruct = malloc(sizeof(struct mStruct));
    }

    (*pStruct).age = 25;
    (*pStruct).func1 = &func1;
    (*pStruct).func2 = &func2;
 }

 char func_1(void)
 {
   ... ;
  }    
 char func_2(char)
 {
   ... ;
  }

我已经尝试消除init_struct函数,但所有尝试都失败了。我的gcc编译器只接受它如上所述。有没有人知道在不使用函数的情况下初始化结构的另一种方法 或者为什么只能作为void函数接受?

1 个答案:

答案 0 :(得分:0)

实际上,除了标题之外,你的问题似乎与函数指针无关。

你有一些结构mStruct和一些成员。对于你的问题,这些成员是什么并不重要。

使用此结构,您不需要需要初始化函数。你总是可以简单地使用结构并初始化它:

struct mStruct s;
s.member = 20;

但是,这需要付出代价:你重复自己,当你想要改变结构(比如说,添加另一个成员)时,你将不得不改变很多地方。这很糟糕,可以使用初始化函数修复:

void init_struct(struct mStruct *pStruct)
{
    pStruct->member = 20;
}

struct mStruct s;
init_struct(&s);

现在,您不应该向init_struct添加其他职责,而不是初始化它。在您的示例中,您还以错误的方式为结构分配内存。相反,使用另一个功能:

struct mStruct* create_struct()
{
    struct mStruct *pStruct = (struct mStruct*) malloc(sizeof(struct mStruct));
    init_struct(pStruct);
    return pStruct;
}

struct mStruct *pStruct = create_struct();
do_something_with(pStruct);
free(pStruct); // Don't forget this!

如果你需要更多的清理而不仅仅是释放内存,请为它编写另一个函数:

void destroy_struct(struct mStruct *pStruct)
{
    cleanup(pStruct);
    free(pStruct);
}

struct mStruct *pStruct = create_struct();
do_something_with(pStruct);
destroy_struct(pStruct); // Don't forget this!