gpt4 book ai didi

c - 在结构体中使用函数指针 - C 编译器

转载 作者:行者123 更新时间:2023-11-30 17:39:38 25 4
gpt4 key购买 nike

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

这是我的问题

这段代码运行正常,但是...

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 函数接受?

最佳答案

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

您有一个包含一些成员的结构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!

关于c - 在结构体中使用函数指针 - C 编译器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21746138/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com