变量的地址需要加载到内存中吗?

Mai*_*k R 13 c++ variables pointers

我有一个问题 - 使用以下代码我试图找出存储在某个地址的内容以及我的静态变量存储在这个特定位置的时间.(我读到静态变量无限存储并且非常惊讶 - 想测试这是否属实).代码定义了一个静态变量(它在我的系统上的地址是0x1000020c0 - 这可能是相当随机的但是一直是这种情况)

如果我现在想要找出该地址存储的整数值,我必须先用$ number打印出地址,然后给出0x1000020c0.重新/重新解释地址(0x1000020c0)仅提供100!如果地址是在之前打印的,或者我在重新解释/重铸中使用&编号.

有人可以解释为什么会这样吗?

int static number = 100;  

//  std::cout << number << std::endl; <- prints 100

//  prints 100 and the address 0x1000020c0 in my case
//  std::cout << number << " " << &number << std::endl;

//  this does not work unless &number is printed previously
//  std::cout << "Value is :  " << *reinterpret_cast<int*>(0x1000020c0) << std::endl;

// this does work and show the correct value (100)
std::cout << "Value is :  " << *reinterpret_cast<int*>(&number) << std::endl;
Run Code Online (Sandbox Code Playgroud)

eer*_*ika 19

在任何给定的程序中,对象可能或可能不存储在地址0x1000020c0中.无论如何都无法保证.对象的地址在编译时(或可能在链接时)决定.对程序的更改可以更改地址.

如果您从未获取本地静态对象的地址,并且从不修改它,则编译器可以优化该变量,以便不使用任何内存.如果该对象根本不存在,那么它肯定不存在于内存位置0x1000020c0.

如果以需要对象存在的方式使用对象,则它将位于某个内存位置.获取对象的地址通常会触发此类要求.这与物理学中的观察者效应惊人地相似.

如果取消引用未指向对象(适当类型)的指针,则行为未定义.


当我打印重铸/重新解释0x1000020c0的值时,它什么都不打印

如上所述,不保证对象存在于内存位置0x1000020c0.

即使该对象被使用,因为我通过std :: cout << number打印了它的值;

访问对象的值不一定需要该对象存在.编译器可能能够证明对象的值是100,因此它可以将该值存储为常量而根本不存储静态对象.

此外,即使静态对象确实存在,它也不一定存在于地址0x1000020c0中,除非您获取地址并观察它.


因此:不要将任意数字转换为指针(除非您在某些具有硬编码内存映射的嵌入式平台上工作).看到一个程序中对象的地址是0x1000020c0,在另一个程序中不会使0x1000020c0成为非任意对象.

  • 这就是为什么你应该在C++提供的抽象中编程,而不是将你的源代码视为你的计算机执行的指令列表(它不是!) (2认同)