手动设置指针值

时间:2011-07-16 23:58:13

标签: c pointers int pointer-address

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

示例:

MyClass* obj = SomeMethodReturningAPointerOfMyClass();
int address = (int) &obj;
return address;

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

然后,在另一方面,我想做类似的事情:

MyClass* obj = (MyClass*) address;

这不起作用,因为我无法在不收到错误的情况下访问任何obj方法。


我找到了办法:

MyClass* obj = SomeMethodReturningAPointerOfMyClass();
machine->registers[2] = (int)obj;

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

MyClass* obj = (MyClass*)address;

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

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

5 个答案:

答案 0 :(得分:6)

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

第二关,不要这样做int不是内存地址的C或C ++类型 - 指针是,并且您已有一个。

intMyClass *不同。实际上,在64位系统(包括大多数现代PC)上,转换指针指向整数的指针会降低指针值的一半,结果无效。

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

MyClass *GetAnObject(void) {
    MyClass *result = ...;
    return result;
}

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

答案 1 :(得分:1)

显然,由于您使用的是类,因此您可能使用的是C ++,而不是C语言。

我真的很想知道你为什么要将对象指针存储在int中?

关于你的问题:根据平台,(对象)指针可能不适合int。如果将指针强制转换为int,则可以简单地截断指针值。现在,如果您稍后退回,指针不完整,并指向内存中某个未确定的位置。这可能会导致问题。

换句话说:不要这样做。它不仅很可能失败,甚至可能导致很多问题。

答案 2 :(得分:0)

首先,你应该使用unsigned long类型而不是int,因为指针是32位宽(至少在32位架构上;如果你使用unsigned long long想要64位知道)。

接下来,当您使用{{1}存储obj 的地址时,存储在address变量中的内容不是MyClass*而是MyClass**分配给&obj时...(并且address已经是obj类型)

所以你应该直接存储MyClass*指针,或者如果你想存储MyClass*的指针,即MyClass*,你需要再使用一个指针将它间接两次'*'平衡'&'你在影响MyClass**时写道:

address

答案 3 :(得分:0)

&obj返回存储指针obj的地址,这不是你想要的。真正的答案更简单:

void *obj = SomeMethodReturningAPointerOfMyClass();
return (int) address;

请注意,如果int的大小与系统上的指针大小不同,则会中断。您可能希望以void *intptr_tlong传递此信息。

答案 4 :(得分:0)

根据您的系统,int可能不是一个好选择。如果确实必须将指针作为整数值传递,则应使用始终保证与指针一样大的uintptr_t

此外,&obj可能不是您想要的。我认为你的意思是obj