将地址指定为指针的文字?

时间:2017-07-21 18:04:46

标签: c++

由于指针的值是一个内存地址,如0x0224,你能以某种方式将指定为字面的地址指定给指针吗?我已经尝试过为指针指定一个整数文字,但是这并没有真正解决,你可能猜到了。

3 个答案:

答案 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位宽的总线。