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