代码之家  ›  专栏  ›  技术社区  ›  user8221510

将地址作为文字分配给指针?

c++
  •  -1
  • user8221510  · 技术社区  · 7 年前

    由于指针的值是一个内存地址,如0x0224,您能否以某种方式将一个作为文字给定的地址分配给指针?我曾尝试将整数文字赋给指针,但正如您可能猜到的那样,结果并不太好。

    3 回复  |  直到 7 年前
        1
  •  2
  •   Curious    7 年前

    你可以用一个简单的 reinterpret_cast

    auto ptr = reinterpret_cast<void*>(0x123);
    
        2
  •  0
  •   Patrick87    7 年前

    你完全可以做到心满意足。如果您碰巧试图访问进程分配的内存空间之外的内存,隔离进程内存空间的操作系统通常会终止您的程序,但只要您分配的值是允许进程访问的值,您就可以读写(可能受到一些附加限制)。

    怎样 实际执行这样的任务。这在其他答案中得到了很好的阐述。简而言之,您应该将文字转换为适当类型的指针值。

        3
  •  0
  •   2785528    7 年前

    以某种方式将作为文字的地址分配给指针?

    我认为你的桌面的答案是“不”。

    因此,问题可能是如何发现在编译时使用的特定地址,用它创建可重复的文字。如何确定下次跑步时可以访问哪些(?虚拟)内存?


    因此,让我举一个在电信行业工作的嵌入式系统的例子。我认为,当你的代码可以访问物理内存映射设备时,你会发现这与你的问题所暗示的有关。

    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
      };
    

    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\u LMPTEST\u 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); 
    

    (仅供参考-change()方法在.cc文件中实现,其他地方。)

    这很像你在问题中提出的建议…文字(即枚举)可以转换为物理地址,如果地址正确映射到硬件,尤里卡!我们有扇子。