关于C#:铸造指针警告

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 *。这就是错误的来源。


((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)个数组。