我有一個這樣定義的結構
typedef struct{
int id;
char* name;
float percentage;
}student_t;
并且有一個函式是以這種格式列印結構的成員
"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);
}
}
但我無法編譯,它說警告:延遲 void* 指標錯誤:在不是結構或聯合的東西中請求成員“id”錯誤:在不是結構或聯合的東西中請求成員“名稱”錯誤:請求成員非結構體或聯合體中的“百分比”
我是否必須對引數 val_ref 進行型別轉換?
uj5u.com熱心網友回復:
fprintf(fp, "%d,%s,%.2f", val_ref->id, val_ref->name, val_ref->percentage);在這里,您需要轉換val_ref為它實際是的指標型別:(student_t *)val_ref然后為 eg 獲取結構體的成員((student_t*)val_ref)->id。
當您有 時void*,您的程式不知道您指向的實際資料型別。因此,嘗試獲取成員是非法的。使用演員表時,您明確指出val_ref指向 astudent_t并且當您要求特定成員時您知道自己在做什么。
但是,沒有必要進行強制轉換,fp因為該函式fprintf具有FILE *其簽名中的第一個引數:
int fprintf(FILE *stream, const char *format, ...);
因此,即使您將 avoid *作為第一個引數傳遞,區域變數也stream被定義為 a FILE *,這就是函式的作用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/314964.html
