【问题标题】:Use function pointer in struct - C compiler在结构中使用函数指针 - C 编译器
【发布时间】:2014-02-13 05:40:46
【问题描述】:

我找到了如何在 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 函数接受?

【问题讨论】:

  • 您还没有向我们展示您的其余代码。里面有东西在调用 init_struct(),否则就不需要了。
  • (*pStruct).age之类的代码可以换成pStruct-&gt;age,更清晰。
  • 该代码不应该编译;您在定义中将其称为func_1,但在初始化函数中将其称为func1
  • 我几乎不敢提及该函数中的内存泄漏。轮子用完了要脱落。
  • “没有泄漏内存,因为我有足够的内存”是一个非常错误的说法。内存泄漏是您的代码的一个非常严重的问题。时期。修理它。现在。

标签: c function pointers struct


【解决方案1】:

其实除了标题,你的问题似乎和函数指针无关。

你有一个结构 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!

【讨论】:

  • 哇 .. 非常感谢你。我也认为我的方式不正常,这就是我问这个问题的原因。你的回答清楚地释放了我的压力。而且我肯定也会释放内存.. tc.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-26
相关资源
最近更新 更多