当前位置: 首页 > 知识库问答 >
问题:

指针的地址将存储在内存中的哪里?

谭向晨
2023-03-14

我正在学习虚拟内存和自由空间管理。

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

假设

int *ptr = malloc (16);

返回我的4008地址。它从4008到4022开始。这个块在堆中。但是4008本身在哪里?

它存储在堆栈中吗?

共有2个答案

融修平
2023-03-14

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

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

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

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

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

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

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

燕琛
2023-03-14

考虑到您的示例代码:

int *ptr = malloc(16);

指针ptr被初始化为malloc的返回值。让我们假设malloc返回4008。因此,ptr的值变为4008。根据编译器的不同,该值可能最终只存储在寄存器中,在这种情况下,从技术上讲,ptr没有地址,但由于编译器需要像它那样运行,如果您使用ptr的地址(例如通过表达式

 类似资料:
  • 我是gccgo新手,我需要编译/运行以下代码的帮助(这在“标准”go编译器中可以正常工作(抱歉,我不知道正确的名称)): 我的gcc: 我的第一个文件: 我的第二个文件: 我的编译错误: 我做错了什么?

  • web3.eth.getStorageAt()方法返回一个以太坊地址的指定位置存储内容。 调用: web3.eth.getStorageAt(address, position [, defaultBlock] [, callback]) 参数: address:String - 要读取的地址 position:Number - 存储中的索引编号 defaultBlock:Number|Stri

  • 问题内容: 正如“具有ipv6功能的inet_aton和inet_ntoa功能所需 ”中所要求的那样,当前没有用于存储IPv6地址的MySQL函数。建议用于存储/插入的数据类型/功能是什么?(我不打算将它们存储为字符串)。我也不想将IPv6地址分为2个INT。 问题答案: 怎么样: 那应该足够有效。 如该错误报告中所述,当前在MySQL服务器中没有将文本IPv6地址从二进制转换为二进制的功能。您需

  • 内存32位和64位的区别 ///01.Point.c #include <stdio.h> #include <stdlib.h> //01.指针变量所占用的内存尺寸由编译器进行直接决定 // 指针变量所占用的内存尺寸同时直接或间接与CPU-->操作系统-->编译器平台有关 // 综合决定:CPU-->操作系统-->编译器平台 // 直接决定:编译器

  • 问题内容: 我已经尝试了好几个小时,并且用谷歌搜索了所有我想到的东西,但是我快要疯了。 我有一个结构: 直到以后,我才知道int (矩阵)和char 的大小。 完成后,我将创建共享内存,如下所示: 没问题 然后,我给ctrl-> rows和collumns赋一个值,并将0赋给所有矩阵。 但是之后,我在char *和bam中写了一些段错误。 调试程序时,我看到mat和IDs_row这两个指针都为nu

  • 我收到一个无效内存地址的运行时错误。 channel.go看起来像这样: 第36行怎么可能导致这种情况?m是否有可能为零?如果是,如何? 注意:哈希定义为字符串