有没有办法在不使用指针或引用的情况下手动访问内存地址?让我们说我知道整数存储在地址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;
}
当我测试它时结果是准确的 - 当有人试图编译该代码时,它可能会给出不同的输出
答案 0 :(得分:4)
如果要在特定地址打印整数值,则需要执行
std::cout << *(int *)0x28fed8 << std::endl;
所以你要取消引用指针而不是打印指针值本身。
至于你的双重值是错误的,我怀疑与编译器优化有关。在w2
变量写入值之前,您的b
指针被取消引用。如果这是真的,那么你恰好幸运地使用了a
和w1
。
如果将b
和a
变量移出到全局变量或将其标记为静态变量,该怎么办?这应确保该值由指针解除引用的时间设置,因为它可能在编译时被硬编码。
否则,请尝试使指针易变 - 即volatile double *w2
和volatile int *w1
,以便编译器不会尝试优化。
(总的来说,你的代码看起来很狡猾。但是,我并不确定它是否会调用未定义的行为 - 也许其他一些用户可以对此有所了解)