2016-07-03 79 views
3

我仍然在学习C++,并花了数小时试图找出一种方法来获取存储在某个内存地址的字节,在我的情况下,所有(好吧,几乎所有)内存地址都不是动态的 - 所以指向,例如变量不会改变。从内存地址获取字节?

所以我试图检索存储在已知内存地址的单个字节。 例如,让我们假设:0x20000

我试图检索的字节是,例如,假设我们说0xEF

现在我将如何检索字节而不使用解除引用运算符? 所以基本上我需要得到0xEF而不必声明它是什么类型的数据类型,就像字面上只是物理上获取字节0xEF。 希望这是有道理的,我是一个小菜鸟:/

+1

'uint8_t mybyte = *的reinterpret_cast (地址0x20000);' – md5i

+0

当你说'0xEF'是从内存位置'0x20000'的偏移量? – Galik

+0

如果Galik是正确的,那么在我之前发布的表达式中加入'0xef'。 – md5i

回答

3

现在我将如何检索字节而不使用解除引用运算符?

如果不解除引用访问的地址,则不能这样做。您可以解决的最小数据类型是char。对于字节,通常使用typedef unsigned char uint8_t

因此,您必须使用reinterpret_cast<uint8_t*>(addr)访问内存地址并取消引用以获取该值。

1

取消引用内存地址是获取字节值的唯一方法。

铸字的内存地址的类型指针,然后解引用它是最直接方式,如:

unsigned char value = *(reinterpret_cast<unsigned char*>(0x20000)); 

然而,要回答你的问题:

如何将我检索不使用解除引用运算符的字节

您可以解除引用使用memcpy()或类似的功能,内存间接如:

#include <cstring> 

unsigned char value; 
std::memcpy(&value, (void*)0x20000, 1);