问题描述
我想在 C 中创建一个类似于课程注册的结构。为此,我使用了结构而不是表。
STUDENT *createStudent(){
return (STUDENT *) malloc(sizeof(STUDENT));
}
TEACHER *createTeacher(){
return (TEACHER *) malloc(sizeof(TEACHER));
}
COURSE *createCourse(){
return (COURSE *) malloc(sizeof(COURSE));
}
COURSEREGISTRATION *createCourseRegistration(){
return (COURSEREGISTRATION *) malloc(sizeof(COURSEREGISTRATION));
}
void *createNode(int choise){
void (*fp[]) () = {createStudent,createTeacher,createCourse,createCourseRegistration};
return (fp[choise] ());
}
我想用 func 指针 做 malloc 并在这个函数(主函数)中得到一个错误;
STUDENT *studentHead = NULL;
void *temp = studentHead;
temp = createNode(0);//Zero for student
我不太清楚 func 指针。我应该怎么办?我哪里错了?或者我可以在这种情况下使用 func 指针吗?
THX
编辑: 我是这样解决的;
#define CREATESTUDENT 0
#define CREATETEACHER 1
#define CREATEDCOURSE 2
#define CREATECOURSEREGISTRATION 3
void createNode(void **temp,int choise){
switch(choise){
case CREATESTUDENT:
*temp = (STUDENT *) malloc(sizeof(STUDENT));
break;
case CREATETEACHER :
*temp = (TEACHER *) malloc(sizeof(TEACHER));
break;
case CREATEDCOURSE :
*temp = (COURSE *) malloc(sizeof(COURSE));
break;
case CREATECOURSEREGISTRATION :
*temp = (COURSEREGISTRATION *) malloc(sizeof(COURSEREGISTRATION ));
break;
}
}
STUDENT *temp = studentHead;
createNode(&temp,CREATESTUDENT);
解决方法
您将 fp
声明为 {
void (*fp[]) () = {
这是一个指向返回 void 的函数的指针数组。你想要返回指针的函数,所以你想要
void *(*fp[])() = {
但是你仍然有问题,你用来初始化这个数组的函数指针是错误的类型——它们都是返回指向真实类型(不是空)的指针的函数。因此,虽然这可能会奏效,但就标准而言,这实际上是未定义的行为。
如果您将所有 create
函数更改为返回 void *
而不是 STUDENT *
(以及类似的),那么它是安全的。
简短的回答:您的函数 ptr 签名是 void ()
而不是 void* ()
高兴地庆祝 C++ 不太关心函数返回类型:)
TL;DR;
为什么要让生活变得比他们需要的更艰难? 为什么不使用简单的开关
void *createNode(int choice){
switch(choice){
case 0:
return createStudent();
case 1:
return createTeacher();
...
...
}
}
注意:我从一开始就没有看到创建 createNode
的意义。它似乎具有误导性的签名,我会让 API 用户明确调用 createStudent
、createTeacher
等。
一些编码风格建议:
- typedef 你的函数签名
- 声明你的函数数组(最好是模块的成员或静态)
根据您的代码,fp
是 void
,而不是 void*
函数。无论 createNode
是什么,您始终不会从 choice
返回任何内容。