【问题标题】:Casting pointer warning铸造指针警告
【发布时间】:2011-04-27 02:00:15
【问题描述】:

在我正在编写的 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 成为一个指针,因为我需要它的范围超出它所在的函数的范围。

有什么线索吗?

【问题讨论】:

  • 此外,当我从右侧删除星号时,它会给我一个警告“从指针转换为不同大小的整数”和“下标值既不是数组也不是指针”的错误。
  • 您想让我们猜一下警告是什么吗?

标签: c variables pointers casting warnings


【解决方案1】:

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

【讨论】:

  • @zach,你已经把“pde”变成了一个指针——它是一个unsigned int *。解决办法在别处。
  • @zach 您需要将 rhs -- 分配给 pde 的值 -- 设为指针;请参阅我的答案以了解如何做到这一点。
【解决方案2】:

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

但坦率地说,您甚至似乎都不太了解指针在 C 中是如何工作的。在您更好地掌握这些东西之前,您绝对不应该使用这些技巧。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-03
        • 2010-12-27
        • 2011-03-26
        • 1970-01-01
        • 2019-01-03
        • 1970-01-01
        相关资源
        最近更新 更多