指针的地址将存储在内存中的什么位置?

Where will the address of pointers be stored in memory?

正在研究虚拟内存和自由space管理。

我知道我们使用 malloc 分配的指针将在堆中请求一块内存。 但是当我们调用 malloc() 系统调用时,它会return一个整数作为专用内存块的地址,但是这个地址本身会存储在哪里?

假设

int *ptr = malloc (16);

returns 4008 内存地址。它从 4008 开始到 4022。这个块在堆中。但是 4008 本身在哪里?

是否存储在堆栈中?

考虑您的示例代码:

int *ptr = malloc(16);

指针ptr被初始化为malloc的return值。让我们假设 malloc returns 4008。因此,ptr 变为 4008。根据编译器的不同,这个值可能最终只存储在一个寄存器中,在这种情况下,技术上 ptr 没有地址,但是由于编译器需要像它一样运行,如果你取 ptr(例如表达式 &ptr,类型为 int **)指针将与其他局部变量一起存储在堆栈中。同时,ptr 指向的值将存储在由 malloc 编辑的地址 return,在本例中为 4008.

在 C 中,基本上有三种类型的数据内存(省略常量):

  • 正常,全局"data"
  • 栈,用于本地数据
  • 堆,动态托管数据

第一个区域有固定大小,在编译时确定;其中的所有内容都是一个变量,具有地址和大小。第二个区域,堆栈,与第一个区域类似:存储在其中的所有内容都有一个名称,即它是一个变量。局部数据和全局数据的区别在于,局部数据只有在执行一个函数时才会存在,然后就消失了。换句话说,每个函数都有它的本地临时数据,可以认为这些数据与全局数据完全一样,但会消失。

有两个注释要添加。首先,我写 "stack" 因为经常是一个堆栈,但这不是强制性的;重要的是临时。第二个注意事项是:程序所做或管理的一切都必须从驻留在全局或本地数据中的 变量 开始。这些变量是通往所有其他记忆的大门。

最有趣的地方是第三个,堆。在程序启动时,可能没有堆(或者它是空的)。要使用堆,程序必须从中分配 ("ask") 内存。请求的内存现在是程序的 "reserved",它必须存储一个地址(或 "handle")到该区域。如果不存储地址,程序将无法访问该内存。

堆也很特殊,因为它是唯一完全由程序员而不是编译器管理的区域。

一切总是来自变量。所以问题 "where will the address of pointers be stored" 只能是一个:在一个变量中。除非它存储在堆本身中,在可通过指针访问的区域中,该指针再次存储到本地或全局数据中的变量中。