【问题标题】:In C++, I'm getting a message "error: 'void*' is not a pointer-to-object type"在 C++ 中,我收到一条消息“错误:‘void*’不是指向对象的指针类型”
【发布时间】:2015-04-12 04:24:58
【问题描述】:

这是我的代码:

#include <iostream>
using namespace std;

int main()
{
   void *x;
   int arr[10];
   x = arr;
   *x = 23; //This is where I get the error
}

如您所见,代码非常简单。它只是创建一个指向数组'arr'的内存地址的空指针x,并将整数23放入该内存地址。但是当我编译它时,我收到错误消息“'void*' is not a pointer-to-object type”。当我使用“int”指针而不是 void 指针然后编译它时,我没有收到任何错误或警告。我想知道为什么会出现这个错误。

谢谢。

【问题讨论】:

  • void y; y = 32; 无法编译的原因相同:编译器不知道如何将某些内容存储到不完整类型void 中。如果x 指向shortlong long 怎么办?
  • 这也取决于你的编译器。诠释* x = 42; LLVM 产生错误。
  • @chrizke 您的代码与问题有何关联?
  • @Slava,你是对的。我错过了 *x=23; 中 x 左边的 *。

标签: c++ compiler-errors codeblocks memory-address void-pointers


【解决方案1】:

你不能取消对 void* 的引用,这就是编码器正在做的事情。

*x = 23; // this cant be done with void*

改为:

x = &arr[index] ; // this is correct

【讨论】:

    【解决方案2】:

    编译器需要变量的类型来取消引用指针。

    只有没有 malloc 的例子: *int myPtnr = 0x12345;

    当你写作时

    *myPtr = NUM​​BER:

    编译器查看类型并说.. 好吧,我们有一个 int ... 我需要的信息在接下来的 4 个字节中,从指针的地址开始。

    这就是你必须告诉编译器类型的原因。当您使用 void 时,编译器不知道他必须使用多少字节来取消引用。

    【讨论】:

      【解决方案3】:

      正如编译器消息所说,void* 不是指向对象类型的指针。这意味着您不能对void* 进行任何操作,除了将其显式转换回另一种指针类型。 void* 代表一个地址,但它没有指定它所指向的事物的类型,因此您无法对其进行操作。

      【讨论】:

      • 限制性稍强,对象的地址或NULL,而不是函数的地址。
      • @Deduplicator:或者一个函数,如果编译器允许条件支持的转换。
      猜你喜欢
      • 2011-12-18
      • 2012-11-24
      • 2019-05-04
      • 2011-12-18
      • 2013-10-24
      • 2017-04-22
      • 1970-01-01
      • 2013-05-18
      • 2020-08-30
      相关资源
      最近更新 更多