手动访问内存地址

时间:2014-08-02 03:51:16

标签: c++ pointers memory-address

有没有办法在不使用指针或引用的情况下手动访问内存地址?让我们说我知道整数存储在地址0x28fed8,我想打印那些数据。我已尝试std::cout << (int*)0x28fed8,但它只输出0x28fed8。当我为一个像int* w1= (int*)0x28fed8;这样的指针指定整数但是给出一个双变量(2.22064e-313)的奇怪结果时,它也有效

#include <iostream>

int main(){
   int a=10;
   int* w1= (int*)0x28fed8;

   double b=100.578;
   double* w2= (double*)0x28fed0;

   std::cout << &a << std::endl;  // output 0x28fed8
   std::cout << *w1 << std::endl; // output 10

   std::cout << (int*)0x28fed8 << std::endl; // output 0x28fed8

   std::cout << &b << std::endl;  // output 0x28fed0
   std::cout << *w2 << std::endl; // output 2.22064e-313

   return 0;
}

当我测试它时结果是准确的 - 当有人试图编译该代码时,它可能会给出不同的输出

1 个答案:

答案 0 :(得分:4)

如果要在特定地址打印整数值,则需要执行

std::cout << *(int *)0x28fed8 << std::endl;

所以你要取消引用指针而不是打印指针值本身。

至于你的双重值是错误的,我怀疑与编译器优化有关。在w2变量写入值之前,您的b指针被取消引用。如果这是真的,那么你恰好幸运地使用了aw1

如果将ba变量移出到全局变量或将其标记为静态变量,该怎么办?这应确保该值由指针解除引用的时间设置,因为它可能在编译时被硬编码。

否则,请尝试使指针易变 - 即volatile double *w2volatile int *w1,以便编译器不会尝试优化。

(总的来说,你的代码看起来很狡猾。但是,我并不确定它是否会调用未定义的行为 - 也许其他一些用户可以对此有所了解)