繁体   English   中英

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

[英]Where will the address of pointers be stored in memory?

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

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

假设

int *ptr = malloc (16);

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

它存储在堆栈中吗?

考虑您的示例代码:

int *ptr = malloc(16);

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM