繁体   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