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

C 指针的地址将存储在内存中的什么位置?,c,memory-management,virtual-memory,C,Memory Management,Virtual Memory,我在学习虚拟内存和可用空间管理 我知道我们使用malloc分配的指针将请求堆中的内存块。 但当我们调用malloc()系统调用时,它将返回一个整数作为专用内存块的地址,但这个地址本身将存储在哪里 假定 int *ptr = malloc (16); 返回内存的4008地址。从4008开始到4022。这个块在堆中。但4008本身在哪里 它是否存储在堆栈中?考虑到您的示例代码: int *ptr = malloc(16); 指针ptr初始化为malloc的返回值。让我们假设malloc返回400

我在学习虚拟内存和可用空间管理

我知道我们使用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

int *ptr = malloc(16);

指针
ptr
初始化为
malloc
的返回值。让我们假设
malloc
返回
4008
。因此,
ptr
的值变为
4008
。根据编译器的不同,此值可能最终只存储在寄存器中,在这种情况下,从技术上讲,
ptr
没有地址,但由于编译器需要像它那样运行,如果您使用
ptr
的地址(例如通过表达式
&ptr
,类型为
int**
)指针将与其他局部变量一起存储在堆栈上。同时,
ptr
指向的值将存储在
malloc
返回的地址,在本例中,
4008
在C中,基本上有三种类型的数据存储器(忽略常量):

  • 正常、全局“数据”
  • 堆栈,用于本地数据
  • 堆,动态管理数据
第一个区域具有在编译时确定的固定大小;其中的所有内容都是一个变量,有地址和大小。第二个区域,堆栈,与第一个类似:存储在堆栈中的所有内容都有一个名称,即它是一个变量。本地数据和全局数据的区别在于,本地数据仅在执行函数时存在,然后消失。换句话说,每个函数都有其局部的临时数据,这些数据可以被认为与全局数据完全相同,但会消失

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

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

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


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

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

  • 正常、全局“数据”
  • 堆栈,用于本地数据
  • 堆,动态管理数据
第一个区域具有在编译时确定的固定大小;其中的所有内容都是一个变量,有地址和大小。第二个区域,堆栈,与第一个类似:存储在堆栈中的所有内容都有一个名称,即它是一个变量。本地数据和全局数据的区别在于,本地数据仅在执行函数时存在,然后消失。换句话说,每个函数都有其局部的临时数据,这些数据可以被认为与全局数据完全相同,但会消失

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

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

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


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

它是一个右值,因此不会存储在任何基于该值定义的内存位置。在您的例子中,由于您执行了
int*ptr=…
,所以您将该右值存储在