Casting pointer warning
在我正在编写的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成为指针,因为我需要将其范围扩展到其所包含功能的范围之外。
有什么线索吗?
-
另外,当我从右侧删除星号时,它会警告我"从指针投射到不同大小的整数",并出现"下标值既不是数组也不是指针"的错误。
-
您希望我们猜测警告是什么吗?
如果只想指向元素的指针,则必须使用+(vaddr >> 22)而不是[vaddr >> 22]。请记住,这里的指针算术以unsigned的大小计数,而不是以字节为单位。
但坦率地说,您似乎甚至都不了解指针在C中的工作方式。在更好地掌握这些东西之前,您绝对不应该使用此类黑客手段。
您正在用[vaddr >> 22]取消引用指针,这意味着表达式的类型为unsigned int。然后,您将其分配给unsigned int *。这就是错误的来源。
-
我如何使" pde"成为指针?
-
@zach,您已将" pde"作为指针-其为unsigned int *。 解决方法在其他地方。
-
@zach您需要使rhs(分配给pde的值)成为指针; 看到我的答案。
((unsigned int*)dereference_physical_page(context >> 12))[vaddr >> 22];
您正在使用dereference_physical_page返回的类型转换指针,并使用此返回的指针访问数组元素...
您没有说"警告"是什么,但是您正在索引一个unsigned int*并产生一个unsigned int,然后尝试将其分配给一个unsigned int*,这将正确地向您发出警告。如果确实需要将结果作为指针,则将值从dereference_physical_page强制转换为unsigned int**(两个'*代替一个)。假定dereference_physical_page(context >> 12)的结果是unsigned int* s数组的地址,而您想要第(vaddr >> 22)个数组。