投射指针警告

时间:2011-04-27 02:00:16

标签: c variables pointers casting warnings

在我写的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作为指针,因为我需要将其范围扩展到它所在的函数之外。

任何线索?

4 个答案:

答案 0 :(得分:2)

您正在使用[vaddr >> 22]取消引用指针,这意味着表达式的类型为unsigned int。然后你将其分配给unsigned int *。这就是错误的来源。

答案 1 :(得分:2)

如果您只想要一个指向该元素的指针,则必须使用+(vaddr >> 22)而不是[vaddr >> 22]。请记住,此处的指针算法的大小为unsigned,而不是字节。

但坦率地说,你甚至似乎都不太了解指针在C中是如何工作的。在明确掌握这些东西之前,你肯定不应该使用这些黑客。

答案 2 :(得分:0)

您没有说出“警告”是什么,但是您正在为unsigned int*建立索引,产生unsigned int,然后尝试将其分配给unsigned int*,会理所当然地给你一个警告。如果您确实需要将结果作为指针,则将值从dereference_physical_page转换为unsigned int**(两个'*'而不是一个)。这假设dereference_physical_page(context >> 12)的结果是unsigned int* s数组的地址,您想要(vaddr >> 22)个。{/ p>

答案 3 :(得分:0)

((unsigned int*)dereference_physical_page(context >> 12))[vaddr >> 22];
您正在使用dereference_physical_page返回的类型转换指针并使用此返回的指针访问数组元素...