C试图将void指针强制转换为另一种类型

时间:2012-02-24 02:13:32

标签: c pointers void void-pointers

好的,这是代码:

//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

感谢您的帮助。

6 个答案:

答案 0 :(得分:2)

如果我正确理解你要做的事情,似乎你需要改变这一点:

void func(void *ptr) {

到此:

void func(void **ptr) {

和此:

func(*ptr);

到此:

func(ptr);

请注意,*(ptr+0)ptr[0]是同义词,*(ptr+1)ptr[1]也是同义词。

答案 1 :(得分:1)

您将ptr声明为void **,但将其用作void *。他们是不同的。

答案 2 :(得分:1)

首先将void指针数组转换为所需指针类型的数组。即,你需要做这样的改变:

((trapframe **)ptr)[0] = tf; //type trapframe *

和另一个像这样的演员:

struct trapframe *parentTF = ((trapfname**)ptr)[0];

答案 3 :(得分: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);

甚至:

{{1}}

答案 4 :(得分:0)

你期待什么?函数的参数ptr是指向“某事物”(即void)的指针。您使用ptr[0]ptr[1]取消引用该指针,尝试提取“某些东西”。但编译器不知道“某事”的类型或大小。

你可能想要的是:

func(ptr);

和此:

void func(void** ptr)
{
...
}

答案 5 :(得分:0)

由于两个文件之间存在不一致,您的代码会出现错误。在一个中,你访问ptr [0]和ptr [1],而在另一个中你访问*(ptr + 0)和*(ptr + 1)...这不会成为错误的来源,因为这两个语法意味着相同的东西,但使用两种不同的形式是糟糕的风格,读取不好,并且容易出错。但是,在一个文件中,您声明void **ptr,但在另一个文件中声明void *ptr - 这不可能是正确的,因为两个ptrs具有相同的语义(它们各自指向一个两个元素的数组,一个tf和一个as)。在一个文件中,您有一个函数,它接受一个名为ptr的参数,但在另一个文件中,您再次传递一个名为ptr ...的变量的内容,因为这两个ptrs具有相同的语义,不一致必定是错误的,显然这是错误的解除引用。删除它,你传递void**,这就是func的参数应该是什么。

代码一致,一整类错误将从您的代码中消失。您可以编写3年或30年的代码,但如果您没有学习这些基础知识则无关紧要。