0

我在 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;

我可以完美地处理 obj !可能不是那么干净,但它应该可以完成它的用途!

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

4

5 回答 5

6

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

其次,不要这样做。Anint不是内存地址的 C 或 C++ 类型——指针是,而且您已经有了一个。

Anint与 a 不同MyClass *。事实上,在 64 位系统(包括大多数现代 PC)上,将指针转换为整数会导致指针值的一半下降,结果无效。

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

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

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

于 2011-07-17T00:05:37.850 回答
1

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

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

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

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

于 2011-07-17T00:09:37.913 回答
0

首先,您应该使用unsigned longtype 而不是 an int,因为指针是 32 位宽的(至少在 32 位架构上;unsigned long long如果您想了解 64 位,请使用)。

接下来,您存储在address变量中的不是 aMyClass*而是 a ,因为您在分配给...时使用MyClass**存储obj 的地址(并且已经是 type )&objaddressobjMyClass*

因此,您应该直接存储MyClass*指针,或者如果要存储 的指针MyClass*,即 a MyClass**,则需要通过再使用一个 '*' 来平衡您在影响时编写的 '&' 来间接两次address

MyClass* obj = * ((MyClass*)address);
于 2011-07-17T00:05:07.450 回答
0

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

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

请注意,如果int与系统上的指针大小不同,这将中断。您可能希望将此作为void *intptr_tlong.

于 2011-07-17T00:05:30.130 回答
0

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

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

于 2011-07-17T00:06:18.803 回答