c++ - c/c++ 指针的内存地址保存在哪里?

标签 c++ c operating-system

如果我执行以下操作:

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/

相关文章:

c - 如何使用包含好的 pcap 结构

c - 矩阵的简单转换但是出了什么问题?

assembly - 什么管理 RAM?

c - 父子进程通过管道进行通信

java - 线程在 Tomcat 中启动和停止失败。发生了什么?

c++ - 普遍接受的变量名称格式 - C/C++

c++ - 为什么 wchar_t* 变量被破坏了?

c++ - 检索 Qt 中打开的 QMainWindows 的数量

c++ - 如何告诉用户在文件名选择对话框中单击了取消?

c++ - 如何正确选择 zmq 最大缓冲区大小?