[英]C trying to cast a void pointer to another type
好的,這是代碼:
//in another file
void **ptr; ptr = kmalloc(sizeof(void *) * 2);
*(ptr+0) = tf; //type trapframe *
*(ptr+1) = as; //type addrspace *
func(*ptr);
這是該函數:
void func(void *ptr) {
struct trapframe *parentTF = ptr[0];
struct addrspace *newAS = ptr[1];
//now I wanna do stuff with parentTF and newAS
}
我得到的錯誤是:
warning: dereferencing `void *' pointer
謝謝你的幫助。
如果我正確理解了您要執行的操作,則似乎需要更改以下內容:
void func(void *ptr) {
對此:
void func(void **ptr) {
和這個:
func(*ptr);
對此:
func(ptr);
注意, *(ptr+0)
和ptr[0]
是同義的, *(ptr+1)
和ptr[1]
也是同義的。
您將ptr
聲明為void **
但將其用作void *
。 他們不同。
首先將void指針數組轉換為所需指針類型的數組。 即,您需要進行以下更改:
((trapframe **)ptr)[0] = tf; //type trapframe *
另一個像這樣的演員:
struct trapframe *parentTF = ((trapfname**)ptr)[0];
在func
,將ptr
聲明為void*
, ptr[0]
與*ptr
相同,而ptr[1]
與*(ptr + 1)
。 正如編譯器所告訴的那樣,您正在嘗試取消引用void
指針。
如果要將void
指針數組傳遞給func
,則需要進行以下更改:
將func
的簽名更改為:
void func(void **ptr)
更改func(*ptr);
簡單地func(ptr);
將動態分配的數組ptr
傳遞給函數。
我也不明白為什么您要將頂部代碼段中ptr
的聲明和初始化分成兩個語句。 只需:
void **ptr = kmalloc(sizeof(void *) * 2);
甚至:
void **ptr = kmalloc(sizeof(*ptr) * 2);
你期望什么? 該函數的參數ptr
是指向“某物”(即void
)的指針。 您可以使用ptr[0]
和ptr[1]
取消引用該指針,以嘗試提取“內容”。 但是編譯器不知道“東西”的類型或大小。
您可能想要的是:
func(ptr);
和這個:
void func(void** ptr)
{
...
}
由於兩個文件之間的不一致,您的代碼會發出錯誤提示。 在其中一個中,您訪問ptr [0]和ptr [1],而在另一個中,您訪問*(ptr + 0)和*(ptr + 1)...在這里碰巧不是錯誤源,因為兩者語法具有相同的含義,但是使用兩種不同的形式是不好的風格,不好讀並且容易出錯。 但是然后,在一個文件中,您聲明void **ptr
但在另一個文件中,聲明void *ptr
可能不正確,因為兩個void *ptr
具有相同的語義(它們每個都指向兩個數組元素,tf和as)。 在一個文件中,您有一個函數帶有一個名為ptr的參數,但是在另一個文件中,您又傳遞了一個名為ptr的變量的內容 ...,因為兩個ptr具有相同的語義,所以這種不一致肯定是錯誤的,而且很明顯取消引用是錯誤的。 刪除它,然后傳遞void**
,這就是func的參數。
一致地編寫代碼,一整套錯誤將從代碼中消失。 您可以編寫3年或30年的代碼,但是,如果您不了解這些基礎知識,也沒關系。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.