好的,这是代码:
//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
感谢您的帮助。
答案 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年的代码,但如果您没有学习这些基础知识则无关紧要。