我需要将this
指针的地址复制到缓冲区并在其他位置重新进行类型转换。如果我在课外做,我知道我能做到。但是,在这里我特别需要使用这里提供的示例代码中给出的一些成员函数:
#include <iostream>
#include <cstring>
class MyClass
{
public:
MyClass(const int & i)
{
id = i;
}
~MyClass()
{
}
void getAddress(char* address)
{
memcpy(address, this, sizeof(this));
}
void print() const
{
std::cout<<" My id: "<<id<<std::endl;
}
private:
int id;
};
int main()
{
MyClass myClass(100);
std::cout<<"myClass: "<<&myClass<<std::endl;
myClass.print();
// Need to copy the address to a buffer, sepcifically using a function as follows and retrieve it later
char tmp[128];
myClass.getAddress(tmp);
// retreiving the pointer
MyClass* myClassPtr = (MyClass*) tmp;
std::cout<<"myClassPtr: "<<myClassPtr<<std::endl;
myClassPtr->print();
return 0;
}
我的输出:
myClass: 0x7fff22d369e0
My id: 100
myClassPtr: 0x7fff22d369f0
My id: 100
我们可以看到两个地址不同。但是,这两个函数都正确打印id。我想知道这是怎么发生的!我还需要正确的方法。
答案 0 :(得分:2)
正确版getAddress()
:
void getAddress(char* address)
{
const MyClass* tmp = this;
memcpy(address, &tmp, sizeof(this));
}
更新
// retreiving the pointer
// MyClass* myClassPtr = (MyClass*) tmp; - wrong
MyClass* myClassPtr = *( (MyClass**) tmp );
答案 1 :(得分:1)
您没有复制this
指针的值,而是指针指向的数据(memcpy
需要复制数据的地址。)
正确的语法是:
MyClass* ptr = this;
memcpy(address, &ptr, sizeof(ptr));
这就是为什么你在最后得到相同/正确的输出。
然后,作业
MyClass* myClassPtr = (MyClass*) tmp;
也是错误的,你将指针设置为与char缓冲区相同的地址,不指向存储在char缓冲区中的地址。
可能的解决方案可能如下所示:
MyClass* myClassPtr;
memcpy( &myClassPtr, tmp, sizeof( MyClass*));
最后:我想知道你想要做什么,你想要实现这样的东西?也许这是解决这个问题的方法,但我强烈认为这是解决实际问题的错误方法......