我遇到了投射问题。
A类有一个公共方法:char* m()
funcA接收一个指向A类型的双指针并将其强制转换为void指针。在funcB中,我希望将它转换回类型A,我可以调用方法m()。我已经尝试了以下但是失败了。
void funcA(const A** a) {
funcB((void*)a)
}
void funcB(void* b) {
A* a = (A*) b; //
printf("M: %s", a->m()); // => crash!
}
如何将void指针强制转换回类型A,以便我可以调用方法?
答案 0 :(得分:3)
两种可能性:
void funcA(const A** a) {
funcB((void*)*a); // passing an A* to funcB
}
void funcB(void* b) {
A* a = (A*) b;
[...]
}
或
void funcA(const A** a) {
funcB((void*)a); // passing an A** to funcB
}
void funcB(void* b) {
A* a = *(A**)(b);
[...]
}
请注意我们在b
中用于投射funcB
的类型必须与我们从funcA
传入的类型相匹配。这很容易出错,因为我们在转换为void*
后会丢弃所有类型信息,因此编译器无法帮助我们。
另请注意,现在写入的方式,我们会丢失原始const
上的a
限定符。这可能是一件坏事。您可能希望转而使用const A*
中的funcB
。
答案 1 :(得分:3)
Type**
是指向Type*
的指针,而Type*
是指向Type
类型对象的指针。
因此,如果我们假设funcA
获得指向A
类型对象的指针的有效指针,则必须首先使用*
运算符取消引用它。
funcB((void*) *a)
您必须看到A** a
参数,就像它实际上一样 - 内存中的值。此值是一个地址,更具体地说是A*
的地址。因此,如果您取消引用A**
,则会获得A*
。您拥有的值又是一个地址,但是A
本身的对象。
A**
拥有A*
A*
包含A
答案 2 :(得分:1)
问题是a
中的参数funcA
是A**
,而不是A*
。因此,您从A**
开始,以A*
结束,地址没有成员。