微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 C 中使用带有 void 的函数指针

如何解决在 C 中使用带有 void 的函数指针

我想在 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 指针ma​​lloc在这函数(主函数)中得到一个错误

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 用户明确调用 createStudentcreateTeacher 等。

一些编码风格建议:

  • typedef 你的函数签名
  • 声明你的函数数组(最好是模块的成员或静态)
,

根据您的代码,fpvoid,而不是 void* 函数。无论 createNode 是什么,您始终不会从 choice 返回任何内容。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。