1

我想知道是否有一种方法可以访问 astruct所指向的数据成员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?为什么或者为什么不?如果是这样,如何?

4

1 回答 1

1

.运算符的优先高于 C 风格的强制转换。所以*(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++ 中使用mallocorvoid*通常不是一个好主意。 malloc仅应在与需要它的 C 库交互时使用。任何void*看起来有用的事情都可以使用模板更安全地完成。在某些情况下,avoid*可能是做某事或“巧妙地”避免代码重复或某事的唯一方法,但仍然谨慎使用它,并且始终非常谨慎。]

于 2018-06-26T23:33:53.900 回答