从 void 指针访问结构中的变量

Access variables in struct from void pointer

我想知道是否有一种方法可以访问 struct 中被 void* 指向的数据成员?我试图解释的内容有望在我的示例代码中更加明显:

int main()
{
  struct S
  {
    int val;
  };
  S s;
  s.val = 5;

  void* p;
  p = malloc(sizeof(S));
  *(struct S*) p = s;
  std::cout<< *(struct S*)p.val << std::endl;

}

我有 运行 将 p 转换为 *(int*)p 的确切代码,打印效果很好,但是,使用上面的确切代码会导致编译错误。一直无法找到完全完成此任务的示例。 struct 转换后是否可以访问其数据成员?为什么或者为什么不?如果是这样,如何?

. 运算符比 C 风格的转换具有更高的 precedence。所以 *(struct S*)p.val 被视为 *((struct S*)(p.val)),这没有意义,因为 p 是一个指针并且没有成员。

因此您需要括号来指定您的意图:

std::cout<< (*(struct S*)p).val << std::endl;

或等价地,

std::cout<< static_cast<S*>(p)->val << std::endl;

[而且:语句 *(struct S*) p = s; 在技术上具有未定义的行为,即使所有大多数实现都允许它。这是因为 C++ 有关于何时创建对象的规则,并且该地址之前没有 S 类型的对象,并且除了某些涉及联合成员的情况外,赋值不会创建对象。没有这个问题的类似语句是 new(p) S{s};.

另外:首先在 C++ 中使用 mallocvoid* 通常不是一个好主意。 malloc 只应在与需要它的 C 库交互时使用。 void* 似乎有用的任何东西都可以使用模板更安全地完成。在少数情况下,void* 可能是做某事或 "cleverly" 避免代码重复或其他事情的唯一方法,但仍要谨慎使用它,并始终格外小心。]