2011-04-27 132 views
0

在C程序我写,有一个函数 void *dereference_physical_page(unsigned int ppn);铸造指针警告

我与unsigned int* pde = ((unsigned int*)dereference_physical_page(context >> 12))[vaddr >> 22];

调用不幸的是,编译器给我的警告,无论我怎么努力,以及程序的需求根据这项任务的规格,没有警告可以编译。

编辑(我想我已经张贴了这个):警告是“初始化将指针从整数,未作类型转换”。如果我删除unsigned int * pde的星号,这将起作用;不过,我想让pde成为一个指针。

我也做PDE的指针,因为我需要它的范围超出,它在功能的。

任何线索?

+0

此外,当我从右侧拿走星号时,它给了我一个警告,“从指针转换为不同大小的整数”以及“下标值既不是数组也不是指针”的错误。 – zach 2011-04-27 02:02:55

+1

您想让我们猜测警告是什么吗? – 2011-04-27 02:05:46

回答

2

您正在使用[vaddr >> 22]取消引用指针,这表示该表达式的类型为unsigned int。然后你将它分配到unsigned int *。这是错误来自的地方。

+0

我怎样才能让“pde”成为一个指针? – zach 2011-04-27 02:07:12

+0

@zach,你制作了“pde”指针 - 它是一个'unsigned int *'。解决办法在别处。 – 2011-04-27 02:08:49

+0

@zach你需要使rhs - 赋给'pde'的值 - 是一个指针;看到我的答案如何做到这一点。 – 2011-04-27 02:12:06

0

你没有说是什么“这一警告”是的,但你是一个索引unsigned int*,这将产生一个unsigned int,然后试图把它分配给unsigned int*,这将理所当然地给你一个警告。如果你确实需要结果是一个指针,那么将值从dereference_physical_page转换为unsigned int**(两个'*'而不是一个)。这假定dereference_physical_page(context >> 12)的结果是unsigned int*的数组的地址,并且您想要(vaddr >> 22)那么一个。

0

((unsigned int*)dereference_physical_page(context >> 12))[vaddr >> 22];
您使用的是dereference_physical_page返回的类型铸造指针和使用该返回的指针访问数组的元素...

2

如果你只是想一个指向元素,你不得不使用+(vaddr >> 22)代替的[vaddr >> 22]。请记住,这里的指针算术计算大小为unsigned,而不是以字节为单位。

但坦率地说,你甚至不似乎深知如何掌握这些事情变得更好之前C.你工作的指针明确不应该使用这样的黑客。