从 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++ 中使用 malloc
或 void*
通常不是一个好主意。 malloc
只应在与需要它的 C 库交互时使用。 void*
似乎有用的任何东西都可以使用模板更安全地完成。在少数情况下,void*
可能是做某事或 "cleverly" 避免代码重复或其他事情的唯一方法,但仍要谨慎使用它,并始终格外小心。]
我想知道是否有一种方法可以访问 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++ 中使用 malloc
或 void*
通常不是一个好主意。 malloc
只应在与需要它的 C 库交互时使用。 void*
似乎有用的任何东西都可以使用模板更安全地完成。在少数情况下,void*
可能是做某事或 "cleverly" 避免代码重复或其他事情的唯一方法,但仍要谨慎使用它,并始终格外小心。]