从内存地址获取字节?

4
我仍在学习C++,已经花费了数小时来寻找一种获取存储在特定内存地址的字节的方法。在我的情况下,所有(几乎所有)内存地址都不是动态的,所以指向变量的地址将不会改变。
因此,我正在尝试检索存储在已知内存地址的单个字节。例如,假设地址为0x20000
我要检索的字节是,例如,0xEF
现在,如何在不使用解引用运算符的情况下检索该字节?所以基本上我需要获取0xEF,而无需声明它是哪种数据类型,只需物理获取0xEF即可。希望这讲得通,我是一个相当新手 :/

1
uint8_t mybyte = *reinterpret_cast<uint8_t *>(0x20000); - md5i
当你说 0xEF 时,它是从内存位置 0x20000 的偏移量吗? - Galik
如果Galik是正确的,那么在我之前发布的表达式中添加0xef - md5i
@md5i,你的第一条消息正是我在寻找的 :) 如果你把它发布在下面,我就会将其标记为答案!不过还是谢谢你的帮助 :) - C0d1ng
2个回答

5

如果不使用间接寻址运算符,我该如何检索字节?

您无法在未进行间接寻址的情况下访问所需地址。您可以访问的最小数据类型是char。通常使用typedef unsigned char uint8_t来表示字节。

因此,您必须使用reinterpret_cast<uint8_t*>(addr) 访问内存地址,并通过间接寻址来获取值。


5

解除内存地址引用是获取字节值的唯一途径。

将内存地址强制转换为类型指针,然后解除其引用是最直接的方式,例如:

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

然而,回答你的问题:

如何在不使用 * 操作符的情况下检索字节?

您可以间接地使用 memcpy() 或类似函数解引用内存,例如:

#include <cstring>

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接