2014-01-21 42 views
1

如果我有一個存儲位置的地址存儲在一個變量中,即uint64_t爲64位系統上的8字節指針,我可以使用存儲在uint64_t中的值來創建一個新指針指向它擁有的內存位置?指向存儲在uint64_t中的內存位置的指針

struct Node { .. }; 
Node* node = new Node(5); 
uint64_t addr = (uint64_t)static_cast<void*>(&node); // 8 byte pointer 

例如節點的地址是0x7fff76bb4880addr存儲140735185373312(的dec表示),我想新的指針Node* new_ptr = (Node*)0x7fff76bb4880

我意識到這將是平臺特定的。

回答

7

該標準保證指針可以轉換爲「足夠大」的整數類型,然後再返回,得到相同的指針值。具體而言,C++ 11 5.2.10重釋施放[expr.reinterpret.cast]/4:

的指針可以被顯式轉換爲任何整數類型足夠大以容納它。映射函數是實現定義的。

和5:

積分型或枚舉類型的值可以顯式轉換爲指針。轉換爲具有足夠大小的整數的指針(如果存在於實現上的話)並返回到相同的指針類型將具有其原始值;指針和整數之間的映射在其他方面是實現定義的。如果支持的話 - -

類型從<cstdint>intptr_tuintptr_t保證是足夠大以存儲任何對象指針類型。通常他們被使用 - 即使你知道uint64_t是你平臺上的指針的大小 - 因爲他們明確表示你打算在指針和整數之間進行轉換。

我將作爲練習讓讀者證明C演員陣容相當於執行reinterpret_cast

TLDR:標準保證這一計劃將永遠不會失敗的斷言:

auto pointer_as_int = reinterpret_cast<uintptr_t>(&foo); 
auto int_as_pointer = reinterpret_cast<decltype(&foo)>(pointer_as_int); 
assert(&foo == int_as_pointer); 
+0

完美。謝謝。 – user3217789