【问题标题】:‘void*’ is not a pointer-to-object type‘void*’ 不是指向对象的指针类型
【发布时间】:2013-10-24 14:30:12
【问题描述】:
struct limit{
  int up;
  int down;
};

void *x;

struct limit *l;
l->up=1;
l->down=20;

x=l;

cout<<x->up;

这是我的代码的一部分我在最后一行出现错误'void*' is not a pointer-to-object type。我知道我的代码中的最后一行是错误的。我只想知道如何使用x 变量打印上下值。

【问题讨论】:

  • 您无法通过void 指针访问任何成员。你为什么要这样做?你能提供一些上下文吗?
  • 你必须cast x。如果你不知道什么是类型转换,你应该得到一些学习资源。
  • 注意,您在上面的代码中使用了未初始化的l
  • 编译器消息实际上说明了一切。由于void* 不是指向对象类型的指针(例如intbool),因此您无法访问其任何正式不存在的成员。 void 指针是否指向具有这些成员的某个结构并不重要。
  • 是的,解释一下为什么使用void *

标签: c++ pointers void-pointers


【解决方案1】:

在这部分:

struct limit *l;
l->up=1;
l->down=20;

您正在取消引用未初始化的指针 l,这会导致 未定义的行为。但是,即使你正确地初始化了它,在你将它分配给void*之后,你也无法取消引用void指针:

void* x = l;
cout<< x->up;

您需要将其显式转换回struct limit*

void* x = l;
struct limit * y = static_cast<struct limit*>(x);
cout << y->up;

甚至更好:首先避免使用void*


既然你提到你这样做是因为,那么this answer 会帮助你:)

【讨论】:

  • 我们可以使用 (limit *) 来代替 static_cast。它有效
  • @rock:在这种情况下(+ 假设这是 C++),static_cast 比 C 风格的演员更合理:)
  • 我们可以混合使用 c 和 c++ :)
  • 在阅读了关于使用 pthreads 的 OP 评论后,我认为他在通过线程函数检索 void* 数据时遇到了问题。如果您可以进行一些额外的更改,那么这个答案应该涵盖他的问题:)。
  • @zoska:我添加了一个指向相关问题的链接 :)
猜你喜欢
  • 2012-11-24
  • 2011-12-18
  • 2019-05-04
  • 2013-05-18
  • 2017-04-22
  • 1970-01-01
  • 2023-02-09
  • 2021-07-22
  • 1970-01-01
相关资源
最近更新 更多