【问题标题】:How to initialize a pointer to a specific memory address in C++ [duplicate]如何在C ++中初始化指向特定内存地址的指针[重复]
【发布时间】:2011-04-25 11:42:40
【问题描述】:

一个有趣的讨论开始了here,但没有人能够提供 C++ 的做法:

#include <stdio.h>

int main(void)
{
  int* address = (int *)0x604769; 
  printf("Memory address is: 0x%p\n", address);

  *address = 0xdead; 
  printf("Content of the address is: 0x%p\n", *address);

  return 0;
}

在 C++ 中做这种事情最合适的方式是什么?

【问题讨论】:

  • 除了更改为 C++ 结构外,在 C++ 中执行此操作的方式没有真正的区别。

标签: c++ c pointers memory casting


【解决方案1】:

在 C++ 中,总是更喜欢 reinterpret_cast 而不是 C-cast。它是如此的丑陋,以至于有人会立即发现危险。

例子:

int* ptr = reinterpret_cast<int*>(0x12345678);

那东西伤了我的眼睛,我喜欢它。

【讨论】:

  • 示例代码在 C 中,并且 OP 知道它是。他在问是否有更好的方法在 C++ 中做同样的事情。在设备驱动程序中,您可能知道要写入的绝对地址。我记得我早期用 MS-DOS 做这种事情直接写入内存屏幕。使用宏 - 当然。
  • 通过地址访问硬件寄存器是嵌入式系统的常见做法。它们要么定义为常量指针,要么使用#define 声明。
  • 你为什么去void*? OP 的代码需要一个指向 int 的指针
  • @John:好点子。改变了它。谢谢。
  • @CashCow:当然——但无论如何你都在进行特定于实现的转换,reinterpret_cast 是 C++ 的实现方式。它更好,因为它更容易找到,并且如果有人尝试移植它,则将其标记为潜在的不安全操作。
【解决方案2】:

没有标准和可移植的方式来做到这一点。不可移植的方式可能包括 reinterpret_cast(someIntRepresentingTheAddress)。

【讨论】:

    【解决方案3】:

    这将起作用:

    void *address=(void *) 0xdead; // But as mentioned, it's non-standard
    
    address=(void *) 0xdeadbeef; // Some other address
    

    【讨论】:

    • 如果问题是“什么是 C++ 方式”,那么您遇到了一个糟糕的情况,并通过使用 void* 使情况变得更糟
    • 甚至不要听他们的,void*由于恐惧而被低估了哈哈。这在某种程度上是一个纯粹的答案
    【解决方案4】:

    在 C++ 中,我更喜欢将指针声明为头文件中的常量指针:

    volatile uint8_t * const UART_STATUS_REGISTER = (uint8_t *) 0xFFFF4000;
    

    在 C 语言中,这通常使用宏来实现:

    #define UART_STATUS_REGISTER ((volatile uint8_t * const) 0xFFFF4000)
    

    在其余的源代码中,内存地址是通过符号名来引用的。

    【讨论】:

      【解决方案5】:

      我要补充一点,如果您希望在指定地址分配对象时调用对象构造函数,则可以为 new 调用放置运算符:

      int *pLoc = reinterpret_cast<int*>(0x604769);
      int *address = new (pLoc) int (1234); // init to a value
      

      这也用于内存缓存对象。创建一个缓冲区,然后为其分配一个对象。

      unsigned char *pBuf = new unsigned char[sizeof(CMyObject) + alignment_size];
      allign_buf(pBuf);
      CMyObject *pMyObj = new (pBuf) CMyObject;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-12
        • 1970-01-01
        相关资源
        最近更新 更多