[英]Use function pointer with void in C
我想做一個類似於 C 中的課程注冊的結構。 為此,我使用了 struct 而不是 table。
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));
}
我想將這些函數傳遞給帶有 function 指針的變量。 喜歡;
void *createNode(int choise){
void (*fp[]) () = {createStudent, createTeacher, createCourse, createCourseRegistration};
return (fp[choise] ());
}
我想用函數指針做malloc並在這個 function (main func) 中出錯;
STUDENT *studentHead = NULL;
void *temp = studentHead;
temp = createNode(0);//Zero for student
我不清楚 func 指針。 我應該怎么辦? 我哪里錯了? 或者我可以在這種情況下使用 func 指針嗎?
謝謝
編輯:我解決了這樣的問題;
#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[])() = {
但是你仍然有一個問題,你用來初始化這個數組的 function 指針是錯誤的類型——它們都是返回指向真實類型(不是 void)的指針的函數。 因此,雖然這可能會起作用,但就標准而言,它實際上是未定義的行為。
如果您將所有create
函數更改為返回void *
而不是STUDENT *
(和類似的),那么它將是安全的。
簡短的回答:您的 function ptr 簽名是void ()
而不是void* ()
高興地慶祝 c++ 不太關心 function 返回類型:)
TL;博士;
為什么要讓生活變得比他們需要的更艱難? 為什么不使用簡單的開關
void *createNode(int choice){
switch(choice){
case 0:
return createStudent();
case 1:
return createTeacher();
...
...
}
}
注意:我沒有看到從一開始就創建
createNode
的意義。 它似乎具有誤導性的簽名,我會明確地讓 API 用戶調用createStudent
、createTeacher
等。
一些編碼風格建議:
根據您的代碼, fp
是void
,而不是void*
function。 無論choice
如何,您總是不會從createNode
返回任何內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.