如果我执行以下操作:
int i, *p = &i;
int **p2p = &p;
我得到 i 的地址(在堆栈上)并将它传递给 p,然后我得到 p 的地址(在堆栈上)并将它传递给 p2p。
我的问题是,我们知道 i
的值保存在内存地址 p
中等等,但是操作系统如何知道该地址在哪里?我想他们的地址在堆栈中是有组织的。每个声明的变量(标识符)是否被视为距堆栈当前位置的偏移量?全局变量怎么样,操作系统和/或编译器如何在执行期间处理这些变量?操作系统和编译器如何在不使用内存的情况下“记住”每个标识符的地址?是否所有变量都按顺序进入(压入)堆栈并且它们的名称被它们的偏移量替换?如果是这样,那么可以更改声明顺序的条件代码呢?
最佳答案
我曾经是一名汇编语言程序员,所以我知道我曾经使用过的 CPU 的答案。要点是 CPU 的一个寄存器被用作堆栈指针,称为 SP(或现在 x86 CPU 上的 esp
)。编译器引用相对于 SP 的变量(在您的情况下为 i、p 和 p2p)。换句话说,编译器决定每个变量应该从 SP 偏移多少,并相应地生成机器代码。
关于c++ - c/c++ 指针的内存地址保存在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15988244/