手动设置指针值

Phi*_*l-R 0 c int pointers pointer-address

我正在使用C.我正在尝试做的是一个函数,它将返回一个包含指向对象的地址的int.然后,使用我收到的int(包含地址),并构建一个指向该地址的指针.

示例:

MyClass* obj = SomeMethodReturningAPointerOfMyClass();
int address = (int) &obj;
return address;
Run Code Online (Sandbox Code Playgroud)

我认为它适用于这一部分.我得到的值是-4197276.(也许我完全错了?)

然后,另一方面,我想做的事情如下:

MyClass* obj = (MyClass*) address;
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为我无法访问任何obj方法而不会收到错误.


我找到了一种方法:

MyClass* obj = SomeMethodReturningAPointerOfMyClass();
machine->registers[2] = (int)obj;
Run Code Online (Sandbox Code Playgroud)

然后,在我收到整数的另一种方法中:

MyClass* obj = (MyClass*)address;
Run Code Online (Sandbox Code Playgroud)

我可以完美地完成对象!可能不是那么干净但它应该为它的用途做好工作!

感谢所有花时间回答的人!

Jon*_*pan 6

首先,不要这样做.你得到指针 的地址obj,而不是它指向的对象.obj已经等于那个地址了.&obj将在堆栈上有一些值(在您的情况下0xFFBFF464),并且当函数返回时它将变为无效.

第二关,不要这样做.一个int是不是一个内存地址C或C++类型-一个指针,而你已经有一个.

一个int与a不一样MyClass *.实际上,在64位系统(包括大多数现代PC)上,转换指针指向整数的指针会降低指针值的一半,结果无效.

如果希望函数返回对象的地址,则返回指针:

MyClass *GetAnObject(void) {
    MyClass *result = ...;
    return result;
}
Run Code Online (Sandbox Code Playgroud)

您永远不需要将指针转换为整数(有些情况下它是有效的,但对于C的新手,完全禁止更容易理解;这些边缘情况超出了这个问题的范围.)