【问题标题】:When does error "expression must have pointer type" occur?什么时候出现错误“表达式必须具有指针类型”?
【发布时间】:2015-10-10 22:48:47
【问题描述】:

我有一个源代码给出错误“表达式必须具有指针类型”

这是遗留代码,我没有完整的代码。错误出现的代码是:

(void *)&arr[0]

我不知道arr 的类型。

  1. 在什么情况下会出现此错误?
  2. 什么类型的arr 可能会导致此错误?

我知道确定问题的数据较少,但我需要用更小的代码来模拟它。任何帮助将不胜感激。

【问题讨论】:

  • 真正的谜团是为什么这段代码(大概)可以同时工作。这个遗留代码来自什么上下文?也许是在某些 16 位系统中,有人将无符号整数视为指针——尽管我认为这会在编译中给出警告而不是直接错误。
  • “我不知道arr的类型...” - 这怎么可能?如果你有源代码,为什么不看看arr 是如何声明的并找出它的类型呢?这将立即说明这里发生了什么。

标签: c pointers types casting compiler-errors


【解决方案1】:

arr 没有指针或数组类型时会发生此错误。除了数组或指针类型之外的任何arr 类型都会导致此错误。

【讨论】:

    【解决方案2】:

    如果您“需要在更小的代码中模拟它”,这里有一个示例

    int main() {
      int arr;
      (void *)&arr[0];
    }
    

    int 类型声明的变量arr 会导致此错误。事实上,任何非数组非指针类型的arr都会导致这个错误。

    【讨论】:

    • 谢谢,但这不会产生确切的错误,它说:“下标值既不是数组也不是指针”......对不起,但我需要确切的错误。
    • @Anuj Priyadarshi:呃..你用的是什么编译器? C没有“确切的错误”。每个编译器都以自己的方式报告错误。错误消息“下标值既不是数组也不是指针......”是 GCC 编译器在这种情况下产生的。您原来的“表达式必须具有指针类型”是不是 GCC 错误消息。尝试使用不同的 编译器来重现错误消息的确切文本是没有意义的。什么编译器产生了原始消息?它实际上听起来像 MSVC 错误消息。
    【解决方案3】:

    “我不知道arr的类型。”

    嗯,你知道它不是什么:指针。因此错误。

    坏消息是:如果没有进一步的信息,就不可能解决这个问题。

    【讨论】:

    • @JAL:它回答了问题的两个“部分”:1)实际上包含在 2)中,我以否定的方式回答,因为它对于一个肯定的答案来说太宽泛了,
    【解决方案4】:

    为了使表达式arr[0] 合法,arr 必须是数组或指针类型。请记住,诸如[] 之类的后缀运算符的优先级高于诸如& 之类的一元运算符,因此整个表达式解析为(void *) (&(arr[0]));也就是说,我们把arr[0]result的地址转换成void *

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-04
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      相关资源
      最近更新 更多