我正在研究虚拟内存和可用空间管理。
我知道我们使用malloc分配的指针将请求堆中的一块内存。 但是,当我们调用malloc()系统调用时,它将返回一个整数作为专用内存块的地址,但是该地址自身将存储在哪里?
假设
int *ptr = malloc (16);
返回4008的mem地址。从4008到4022。此块在堆中。但是4008本身在哪里?
它存储在堆栈中吗?
答案 0 :(得分:5)
考虑您的示例代码:
int *ptr = malloc(16);
指针ptr
被初始化为malloc
的返回值。假设malloc
返回4008
。因此,ptr
的 value 变为4008
。根据编译器的不同,此值可能最终仅存储在寄存器中,在这种情况下,从技术上讲ptr
没有地址,但是由于编译器需要像对待{{ 1}}(例如,表达式为ptr
,类型为&ptr
),指针将与其他局部变量一起存储在堆栈中。同时,由int **
指向的值将存储在ptr
返回的地址中,在此示例中为malloc
。
答案 1 :(得分:1)
在C语言中,基本上有三种类型的数据存储器(省略常数):
第一个区域的大小是固定的,由编译时确定;其中的所有内容都是变量,具有地址和大小。第二个区域,即堆栈,与第一个区域类似:其中存储的所有内容都有一个名称,即它是一个变量。与本地数据和全局数据的区别在于,本地数据仅在执行功能时存在,然后消失。换句话说,每个函数都有其本地临时数据,可以将其视为与全局数据完全相同的东西,但是会消失。
要添加两个注释。首先,我写“堆栈”是因为通常是堆栈,但这不是强制性的。重要的是临时。第二个注意事项是:程序执行或管理的所有操作都必须从变量开始,该变量位于全局或本地数据中。这些变量是通往所有其他内存的大门。
最有趣的区域是第三个区域,即堆。在程序启动时,可能没有堆(或者它是空的)。要使用堆,程序必须从中分配(“询问”)内存。现在,所请求的内存被“保留”给程序,该程序必须存储该区域的地址(或“句柄”)。如果不存储地址,程序将无法访问该内存。
堆也很特殊,因为它是唯一由程序员而不是由编译器完全管理的区域。
一切总是来自变量 。因此,“将指针的地址存储在哪里”的问题只能是一个:在变量中。除非将其存储在堆本身中,否则将存储在可通过指针访问的区域中,该区域将再次存储在本地或全局数据的变量中。