由于指针的值是一个内存地址,如0x0224,你能以某种方式将指定为字面的地址指定给指针吗?我已经尝试过为指针指定一个整数文字,但是这并没有真正解决,你可能猜到了。
答案 0 :(得分:2)
您可以使用简单的reinterpret_cast
auto ptr = reinterpret_cast<void*>(0x123);
答案 1 :(得分:0)
你绝对可以按照自己的心意去做。隔离进程的操作系统&#39;如果您碰巧尝试访问进程分配的内存空间之外的内存,则内存空间通常会终止您的程序,但只要您分配的值是您的进程允许访问的值,您就可以读写(可能受到一些额外的限制)。
正如评论中所指出的,该问题还可能涉及实际执行此类任务的如何。这在其他答案中得到了很好的体现。简短的回答是你应该将文字转换为适当类型的指针值。
答案 2 :(得分:0)
由于指针的值是一个内存地址,如0x0224,你可以 以某种方式将一个给定为文字的地址指定给指针?
我认为桌面的答案是'不'。
用户进程中指针的值是虚拟内存地址。虽然地址实际存在并因此映射到物理内存,但它不会显示物理地址,特别是,每次运行应用程序时,物理可能会有所不同。
因此,问题可能是如何在编译时发现一个特定的地址,用于创建可重复的文字。你如何找到下次运行时可以访问的(虚拟)内存?
在我的桌面上,我想我不能。
所以,让我举一个我的嵌入式系统在电信行业工作的例子。当你的代码可以访问物理内存映射设备时,我想你会发现它是关于你的问题所暗示的。
我将跳到架子上的计算机级别,这里称为mcu。
mcu有多个逻辑设备。在这个片段中,我们随机选择检查pci2(我发现的第一件事)
class mcu_pci2_t // all reg's 32 bit
{
public:
mcu_pci2_t(void){};
~mcu_pci2_t(void){/*always implement*/};
enum MCU_PCI2_CONSTRAINTS
{
MCU_PCI2_ADDR = 0x80000000LU, // 0x8000 0000
//
...
//
MC_SRBL_FPGA_ADDR = MCU_PCI2_ADDR + 0x08000000LU, // 0x8800 0000
//
MC_PCI2_CONSTRAINTS_END
};
接下来,我们将仔细研究MC_SRBL_FPGA_ADDR。 mcu上的硬件逻辑从地址0x8000,0000LU开始,SRBL从0x8800,0000开始。我也删除了很多这些条目。
enum MC_SRBL_CONSTRAINTS
{
CRXX_LED_ADDR = MC_SRBL_FPGA_ADDR + 0x00000004, // 0x8100 0004 red,off Bit0
...
//
FAN_LMPTEST_ADDR = MC_SRBL_FPGA_ADDR + 0x00000040, // 0x8800 0040 normal/test Bit0
//
...
//
现在我们跳到代码如何使用FAN_LMPTEST_ADDR。
class fan_lmptest_t
{
public:
fan_lmptest_t(void){};
~fan_lmptest_t(void){/*always implement*/};
// returns 0 when successful
const char* change(bool on, bool sim=false);
uint32_t value(void) { uint32_t ret_val = reg(); return(ret_val); };
private:
inline vuint32_t& reg(void) {
return(*(reinterpret_cast<vuint32_t*>(FAN_LMPTEST_ADDR)));
};
private: // coding standard: when not used, make NOT accessible AND do NOT implement
fan_lmptest_t(const fan_lmptest_t&); // copy constructor X(const X&)
fan_lmptest_t& operator= (const fan_lmptest_t&);// copy assignment X& operator= (const X&)
};
这里我们看到枚举物理地址值被强制转换为指针
reinterpret_cast<vuint32_t*>(FAN_LMPTEST_ADDR);
在这种情况下,vuint32_t表示命令编译器将此地址的数据视为“volatile uint32_t”。
(fyi - change()方法在.cc文件中实现,其他地方。)
在操作上,决定激活或停用lamptest的用户界面代码与此代码相距很远。它的作用是打开或关闭整个风扇。显然,风扇是灯测试的一部分。一切都很好。
这非常像你在你的问题中建议的......文字(即枚举)可以转换为物理地址,如果地址正确映射到硬件,尤里卡!我们有粉丝。
仅供参考 - 嵌入式操作系统是ONEA的OSE。 mcu是基于一些ppc衍生物,不记得是哪一个。硬件映射内存使用专用的32位宽hw总线,但代码和堆栈和堆驻留在dram内存中,具有合理的缓存和64位宽的总线。