我知道可以使用&
运算符找到变量或函数的内存地址。但是,如果我知道某些内容位于内存位置2
,我该如何访问它?
例如,如果我声明指向2
的指针,它将被读取为值2
,而不是内存地址2
。
答案 0 :(得分:5)
你只需要把它变成一个指针:
int *pointerToTwo = (int *)2;
然后你可以像往常一样取消引用:
int valueAtTwo = *pointerAtTwo;
您执行此类操作的常见原因是访问内存映射寄存器,在这种情况下建议使用volatile
关键字:
int valueAtTwo = *(volatile int *)2;
或者也许将所有的投射都粘贴到宏中以使代码更易于阅读:
#define intValueAt(x) (*(volatile int)(x))
int valueAtTwo = intValueAt(2);
除此之外:2
几乎肯定不是此用例的有效地址。我刚刚使用它,因为你在问题中提到了它。
答案 1 :(得分:1)
void* pMemory = (void*)2L;
这将创建一个void*
(无效指针)并将其地址设置为2
。
请注意,如果您的进程不应该访问该内存(您没有权限从中读取),这可能会导致各种错误。另请注意,您不应随意阅读地址。使用指针直接访问内存位置容易出错。这就是为什么软件开发人员开发了如此多的技术来帮助我们只使用正确的预期数据类型在正确的情况下访问正确的内存地址。
答案 2 :(得分:1)
你可以把它转换为int *来得到一个指针,如下所示:
int *ptr = (int *)2;
然后您可以通过普通*运算符访问2的内容。
int i = *ptr;
会做你想做的事。
但是,值得注意的是,实际上,上面的'i'不是RAM的第二个单元格的实际内容。这是因为在用户模式应用程序中,“2”始终被视为虚拟地址,并且(在运行时)转换为物理地址。通常在类Unix操作系统中无法在用户模式代码中执行此类操作。