2011-07-16 74 views
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的工作完全! 可能不是那麼幹淨,但它應該爲它的用途做好工作!

感謝大家花時間回答!

+1

'int's不包含內存地址。指針呢。返回一個指針。同樣,你使用「類」這個術語意味着C++,而不是C. –

回答

0

首先,應該使用unsigned long類型,而不是一個int,作爲指針是32位寬(至少在32位體系結構;使用unsigned long long如果你想成爲64位感知)。

接下來,在address變量存儲究竟是不是一個MyClass*MyClass**爲您存儲分配給address在使用&obj OBJ的地址...(和obj已經是MyClass*型)

所以你應該直接存儲MyClass*指針,或者如果你想存儲指針MyClass*,即一個MyClass**,你需要間接兩次再用一個'*'來平衡你在影響address時寫的'&' :

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

不,這個例子中的地址是完全無用的,一旦它被返回,因爲它是'obj'的地址,它是一個局部變量堆棧。稍後解除引用幾乎肯定會給垃圾。 –

0

&obj返回在指針obj存儲的地址,這是不太你想要什麼。真正的答案是更簡單:

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

注意,這將打破,如果int不是大小爲您的系統上的指針一樣。你可能想要通過這個作爲void *intptr_tlong

6

首先,不要這樣做。你得到指針的地址obj,而不是它指向的對象。 obj已經等於該地址。&obj將在堆棧上有一定的價值(在你的情況下,0xFFBFF464),並且當你的函數返回時它將會失效。

其次,不要這樣做。一個int不是內存地址的C或C++類型 - 一個指針,並且您已經有一個。

intMyClass *不一樣。事實上,在64位系統(包括大多數現代PC)上,將指針指向一個整數會減少指針值的一半,結果是無效的。

如果你希望你的函數返回一個對象的地址,返回指針:

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

你永遠不應該需要一個指針轉換爲整數(有些情況下是有效的情況下,但對於新人到C,完全禁止更容易理解;這些邊緣情況超出了這個問題的範圍。)

+1

加倍+1「不要這樣做」。 OP正在玩火。 –

+0

你是Romulan還是Jem'Hadar? ROMULAN或JEM'HADAR!? ; p –

+0

哇。只是...哇! –

0

根據您的系統,int可能是一個糟糕的選擇。如果你真的要將指針作爲一個整數值傳遞,你應該使用uintptr_t,它總是保證和指針一樣大。

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

1

顯然,因爲你正在使用類,你可能在C++中的工作,而不是在C.

我真的不知道爲什麼你真的想一個對象指針存儲在一個int?

關於你的問題:根據平臺,(對象)指針可能不適合int。如果將指針指向int,則可以簡單地截斷指針值。現在,如果您稍後退出,指針不完整,並指向內存中某個未確定的點。這可能會導致問題。

換句話說:不要這樣做。它不僅很可能失敗,甚至還會導致很多問題。