簡體   English   中英

C嘗試將void指針強制轉換為另一種類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM