【发布时间】:2021-12-02 21:30:39
【问题描述】:
我有一个这样定义的结构
typedef struct{
int id;
char* name;
float percentage;
}student_t;
还有一个函数就是以这种格式打印struct的成员
"id, name, percentage\n"
但是函数接受void* val_ref //struct ptr, void* fp
我如何使它工作?函数长这样(给定的参数不能修改)
void printStudentInfo(void* val_ref, void* fp)
{
if (val_ref != NULL)
{
fprintf(fp, "%d,%s,%.2f", val_ref->id, val_ref->name, val_ref->percentage);
}
}
但我无法编译,它显示警告:deferencing void* pointer 错误:在不是结构或联合的东西中请求成员“id” 错误:在不是结构或联合的东西中请求成员“名称” 错误:在不是结构或联合的东西中请求成员“百分比”
我必须对参数 val_ref 进行类型转换吗?
【问题讨论】:
-
是的,您必须将 void 指针类型转换回来。或者只是将函数原型更改为采用
student_t*和FILE*而不是 2 个void*参数。为什么要以 void 指针开头?它是给定的功能吗? -
@LouisCloete 是的,它是一个给定的函数,我不能修改参数但是当我像
student_t* val_ref那样进行类型转换时,编译器会告诉我redeclare as a different kind of symbol and previous defined in function parameter -
这里使用void指针没有意义,使用合适的指针类型即可。
-
val_ref->id, val_ref->name, val_ref->percentage->((student_t*)val_ref)->id, ((student_t*)val_ref)->name, ((student_t*)val_ref)->percentage -
我同意@Jabberwocky。问题是什么? void 指针有意义的唯一方法是它是否应该是“通用的”,因为它能够采用一种以上的结构类型和一种以上的输出句柄类型并将通用结构输出到通用输出句柄。