gpt4 book ai didi

c++ - 手动访问内存地址

转载 作者:太空狗 更新时间:2023-10-29 20:59:13 24 4
gpt4 key购买 nike

有没有办法不使用指针或引用而手动访问内存地址?假设我知道整数存储在地址 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;
}

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

最佳答案

如果要打印特定地址的整数值,需要做

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

因此,您取消引用指针而不是打印指针值本身。

至于你的 double 值是错误的,我怀疑这与编译器优化有关。您的 w2 指针在 b 变量写入值之前被取消引用。如果这是真的,那么您只是碰巧遇到了 aw1

如果将 ba 变量移出到全局变量或将它们标记为静态会怎样?这应该确保在取消引用指针时设置该值,因为它很可能在编译时被硬编码。

否则,请尝试使您的指针可变 - 即 volatile double *w2volatile int *w1 这样编译器就不会尝试优化。

(我应该提一下,总的来说,您的代码一开始似乎很狡猾。但是,我实际上不确定它是否会调用未定义的行为 - 也许其他一些用户可以对此有所了解)

关于c++ - 手动访问内存地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25091490/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com