我有一個定義為的結構
typedef struct
{
int id;
char* name;
float percentage;
}student_t;
在給定的函式中
void student_tDeleter(void* val_ref) {
}
我知道如果一個函式必須將 void* ptr 作為其引數,我必須進行型別轉換才能訪問其成員變數,但以下代碼由于某種原因不起作用
void student_tDeleter(void* val_ref) {
free((student_t*)val_ref->id);
free((student_t*)val_ref->name);
free((student_t*)val_ref->percentage);
free(val_ref)
val_ref = NULL;
}
編譯器說```警告:取消參考 void* 指標錯誤:在不是結構或聯合的東西中請求成員“id/name/percentage”
我以為是括號。所以我加了兩個額外的括號
void student_tDeleter(void* val_ref) {
free(((student_t*)val_ref)->id);
free(((student_t*)val_ref)->name);
free(((student_t*)val_ref)->percentage);
val_ref = NULL;
}
但是編譯器說
free(((student_t*)val_ref)->id);
error: incompatible type for argument 1 of ‘free’
free(((student_t*)val_ref)->percentage);
note: expected ‘void *’ but argument is of type ‘float’
extern void free (void *__ptr) __THROW;
我如何正確地釋放()結構成員?任何答復表示贊賞。
uj5u.com熱心網友回復:
運算子優先級
->節拍鑄造。
(student_t*)val_ref->id
// is like
(student_t*)(val_ref->id)
而是使用
((student_t*)val_ref)->id
自由指標
來自莫斯科的@Vlad很好地指出代碼不應該試圖“釋放” a floatnor int。
修復碼
由于free(NULL)是OK,讓我們也允許student_tDeleter(NULL)。
void student_tDeleter(void* val_ref) {
if (val_ref) {
free(((student_t*)val_ref)->name);
free(val_ref)
}
}
uj5u.com熱心網友回復:
資料成員id和percentage不是指標。
typedef struct
{
int id;
char* name;
float percentage
}student_t;
因此,將該函式free應用于型別為intand 的物件是沒有意義的float。
如果資料成員name指向動態分配的記憶體,那么你需要寫
free( ( ( student_t * )val_ref )->name );
進而
free(val_ref)
注意轉換是一元運算子,而運算子->是后綴運算子,優先級高于一元運算子。
uj5u.com熱心網友回復:
結構的非動態分配成員將通過freeing 結構來處理。您只需要單獨釋放任何動態分配的結構成員。
例如:
typedef struct a {
int b;
char *c;
} a_t;
a_t * create_a() {
a_t *new_a = malloc(sizeof(a_t));
new_a->b = 42;
new_a->c = malloc(new_a->b);
return new_a;
}
void delete_a(void *d) {
a_t *a = (a_t *)d;
free(a->c);
free(a);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/314963.html
