2013-08-31 68 views
1

我有一個內存緩衝區的地址我想存儲在一個無符號的整數值。以無符號整數存儲緩衝區的地址;

uint8_t* _buff = new uint8_t[1024]; 
uint64_t* _base_addr = (uint64_t *)_buff; 

我想_buff或_base_addr(反正是同一位置)指向的位置的地址,說uint32_t的值存儲。

這樣,當我讀整數值它給我的地址。 這怎麼辦?

+0

你不能這樣做可靠;無論您嘗試多麼努力,64位系統上的指針都不適合32位無符號整數。可靠的技術是使用'uintptr_t'來存儲值:'uintptr_t base =(uintptr_t)buff;'。另外,使用帶有下劃線前綴的名稱是可以的 - 大多數這樣的名稱是爲實現保留的。 –

+0

那你爲什麼不嘗試'uint32_t * _another_addr =(uint32_t *)_ buff'呢? – nitish712

+0

爲什麼要在地球上做這個?在一天結束時會流淚。 –

回答

4

不能在「說」 uint32_t變量的地址存儲作爲地址可能不適合 - 上指針需要存儲的64位64位系統。代替固定的大小,使用C99的uintptr_t<stdint.h>)或C++ 11(<cstdint>)。

要地址存儲在這樣一個整型變量,使用

uintptr_t variable = (uintptr_t)pointer; 
1

只投它:uint32_t addr = (uint32_t)_buff;

你應該有一個很好的理由這樣做雖然有2個原因:

  1. 它不是便攜式和可能甚至是錯誤 - 地址的大小不同的系統,通常(但不限於)之間是不同的這將是32或64位。

  2. 它影響到了代碼的可讀性。指針的存在正是出於這個原因 - 存儲(和操作)地址。

當您需要操作映射到內存的硬件設備時,您可能希望將地址存儲在整數中。在這種情況下,你需要對自己在做什麼有一個很好的想法。

+0

準確地說,我正在嘗試。硬件寄存器,用於保存某個內存位置的地址。 – Dexter

+0

像這樣投射導致編譯錯誤! – Dexter

+0

你正在玩弄硬件,不知道如何投射或指針已經是一個整數?!我看不到那個結局... – JustSid