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

时间:2019-01-04 10:20:08

标签: c memory-management virtual-memory

我正在研究虚拟内存和可用空间管理。

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

假设

int *ptr = malloc (16);

返回4008的mem地址。从4008到4022。此块在堆中。但是4008本身在哪里?

它存储在堆栈中吗?

2 个答案:

答案 0 :(得分:5)

考虑您的示例代码:

int *ptr = malloc(16);

指针ptr被初始化为malloc的返回值。假设malloc返回4008。因此,ptr value 变为4008。根据编译器的不同,此值可能最终仅存储在寄存器中,在这种情况下,从技术上讲ptr没有地址,但是由于编译器需要像对待{{ 1}}(例如,表达式为ptr,类型为&ptr),指针将与其他局部变量一起存储在堆栈中。同时,由int **指向的值将存储在ptr返回的地址中,在此示例中为malloc

答案 1 :(得分:1)

在C语言中,基本上有三种类型的数据存储器(省略常数):

  • 常规的全局“数据”
  • 堆栈,用于本地数据
  • 堆动态管理数据

第一个区域的大小是固定的,由编译时确定;其中的所有内容都是变量,具有地址和大小。第二个区域,即堆栈,与第一个区域类似:其中存储的所有内容都有一个名称,即它是一个变量。与本地数据和全局数据的区别在于,本地数据仅在执行功能时存在,然后消失。换句话说,每个函数都有其本地临时数据,可以将其视为与全局数据完全相同的东西,但是会消失。

要添加两个注释。首先,我写“堆栈”是因为通常是堆栈,但这不是强制性的。重要的是临时。第二个注意事项是:程序执行或管理的所有操作都必须从变量开始,该变量位于全局或本地数据中。这些变量是通往所有其他内存的大门。

最有趣的区域是第三个区域,即堆。在程序启动时,可能没有堆(或者它是空的)。要使用堆,程序必须从中分配(“询问”)内存。现在,所请求的内存被“保留”给程序,该程序必须存储该区域的地址(或“句柄”)。如果不存储地址,程序将无法访问该内存。

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

一切总是来自变量 。因此,“将指针的地址存储在哪里”的问题只能是一个:在变量中。除非将其存储在堆本身中,否则将存储在可通过指针访问的区域中,该区域将再次存储在本地或全局数据的变量中。