在我写的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 :(得分: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
返回的类型转换指针并使用此返回的指针访问数组元素...