C 手动设置指针值

C 手动设置指针值,c,pointers,int,pointer-address,C,Pointers,Int,Pointer Address,我在C工作。 我试图做的是一个函数,它将返回一个int,其中包含指向对象的地址。然后,使用我收到的int(包含地址),构建一个指向该地址的指针 例如: MyClass* obj = SomeMethodReturningAPointerOfMyClass(); int address = (int) &obj; return address; 我认为这部分很有效。我得到的值是-4197276。(也许我完全错了?) 然后,在另一方面,我想做一些类似的事情: MyClass* obj =

我在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! 可能没有那么干净,但它应该做的工作,因为它的用途


感谢所有花时间回答问题的人

首先,您应该使用
无符号长
类型而不是
int
,因为指针是32位宽的(至少在32位体系结构上;如果您想知道64位,请使用
无符号长

接下来,当分配给
地址时,使用
&obj
存储obj的地址时,存储在
地址
变量中的不是
MyClass*
,而是
MyClass**
。。。(并且
obj
已经是
MyClass*
类型)

因此,您应该直接存储
MyClass*
指针,或者如果您想存储
MyClass*
的指针,即
MyClass**
,您需要使用一个额外的“*”来平衡您在影响
地址时编写的“&”来间接存储它两次:

MyClass* obj = * ((MyClass*)address);

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

void *obj = SomeMethodReturningAPointerOfMyClass();
return (int) address;
请注意,如果
int
与系统上的指针大小不同,则会中断此操作。您可能希望将其作为
void*
intptr\t
long

传递,首先,不要这样做。您得到的是指针的地址,而不是它指向的对象
obj
已等于该地址
&obj
将是堆栈上的某个值(在您的示例中为
0xFFBFF464
),当函数返回时,该值将无效

其次,不要这样做。一个<代码> int /COD>不是内存地址的C或C++类型——指针是,并且已经有一个。
int
MyClass*
不同。事实上,在64位系统(包括大多数现代PC机)上,将指针强制转换为整数会降低指针值的一半,结果无效

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

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

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

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


而且,
&obj
可能不是您想要的。我认为你是指代码> Obj/Obj> ./P>> P>显然,因为你使用类,你可能在C++中工作,而不是在C.</P> 我真的很奇怪为什么你真的想把一个对象指针存储在int中

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


换句话说:不要这样做。它不仅很有可能出现故障,甚至可能导致许多问题。

int
s不包含内存地址。指针可以。返回一个指针。而且,你使用“类”这个词意味着C++,而不是C。你是罗马兰还是杰玛哈达?罗慕兰还是杰姆哈达尔;pName不是对《星际迷航》的引用?>。>Awr。这是你的真实姓名吗?@TomalakGeret'kal让我们看看这段对话,我对此不感兴趣,所以,不,我们不要。不,示例中的
address
一旦返回就完全无用,因为它是
obj
的地址,它是堆栈上的局部变量。以后取消对它的引用几乎肯定只会带来垃圾。