Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C程序设计中的堆内存_C_Memory_Heap Memory - Fatal编程技术网

C程序设计中的堆内存

C程序设计中的堆内存,c,memory,heap-memory,C,Memory,Heap Memory,堆内存到底是什么 无论何时调用malloc,内存都是从称为heap的东西分配的。堆在哪里。我知道,主存中的程序分为显示程序语句的指令段、全局数据驻留的数据段和存储局部变量和相应函数参数的堆栈段。那么,堆呢 基本上,在程序的需要消耗了内存之后,剩下的就是堆。在C语言中,这将是计算机可用的内存,而对于虚拟机,它将小于这个值 但是,这是可以在运行时使用的内存,因为您的程序动态地需要内存 您可能需要查看此文件以了解更多信息: 堆是进程地址空间的一部分。堆可以增大或缩小;您可以通过调用brk(2)或sbr

堆内存到底是什么


无论何时调用malloc,内存都是从称为heap的东西分配的。堆在哪里。我知道,主存中的程序分为显示程序语句的指令段、全局数据驻留的数据段和存储局部变量和相应函数参数的堆栈段。那么,堆呢

基本上,在程序的需要消耗了内存之后,剩下的就是堆。在C语言中,这将是计算机可用的内存,而对于虚拟机,它将小于这个值

但是,这是可以在运行时使用的内存,因为您的程序动态地需要内存

您可能需要查看此文件以了解更多信息:


堆是进程地址空间的一部分。堆可以增大或缩小;您可以通过调用
brk(2)
sbrk(2)
来操作它。这实际上就是
malloc(3)
所做的


从堆中分配比在堆栈上分配内存更方便,因为它在调用例程返回后仍然存在;因此,您可以调用一个例程,比如
funcA()
,来分配一堆内存并用一些东西填充它;在
funcA()
返回后,该内存仍然有效。如果
funcA()

使用堆的一个缺点是,如果忘记释放堆分配的内存,可能会耗尽它。未能释放堆分配的内存(例如,未能从
malloc()
获取
free()
内存)有时称为内存泄漏


堆的另一个很好的特性,与只在堆栈上分配一个本地数组/struct/任何东西相比,是您得到一个返回值,表明您的分配是否成功;如果您试图在堆栈上分配一个本地数组,但用完了,则不会得到错误代码;通常情况下,线程将被中止。

堆与堆栈正好相反。堆是一个可以动态使用的大型内存池,也称为“空闲存储”。这是无法自动管理的内存–您必须显式分配(使用malloc等函数)和释放(例如释放)内存。如果在使用完内存后未能释放内存,则会导致内存泄漏,即内存仍在“使用中”,其他进程无法使用。与堆栈不同的是,除了计算机内存的物理大小之外,堆(或它创建的变量)的大小通常没有限制。在堆上创建的变量可以在程序中的任何位置访问

哦,堆内存需要使用指针

堆的摘要:

  • 堆由程序员管理,修改它的能力是有限的 无边无际
  • 在C语言中,使用malloc()和free()等函数分配和释放变量
  • 堆很大,通常受到可用物理内存的限制
  • 堆需要指针才能访问它

要归功于CraftOfcode,通过阅读这篇文章,这实际上超出了C的范围。C没有指定在
malloc
后面有一个堆;它也可以简单地称为链表;按照惯例,你只是把它叫做堆

标准保证的是,
malloc
将返回一个指向具有动态存储持续时间的对象的指针,而堆只是一种数据结构,有助于提供这种存储持续时间。这是常见的选择。尽管如此,编写堆的开发人员已经认识到它可能不是堆,因此在示例中,您将看不到对术语heap的引用

其他超出标准C领域的东西包括机器代码二进制的细节,编译后它不再是C源代码。布局细节虽然很典型,但都是特定于实现的,而不是特定于C的

堆或用于说明分配的簿记数据结构是在运行时生成的;当调用
malloc
时,新条目(可能)被添加到其中,而当调用
free
时,新条目(可能)被从中删除


因此,对于使用
malloc
分配的对象,通常不需要在机器代码二进制文件中有一个部分,但是在有些情况下,应用程序是单独发送到微处理器中的,在某些情况下,您可能会发现闪存或其他非易失性内存可能会保留用于该用途。

“从堆中分配内存比在堆栈上分配内存更方便,因为它在调用例程返回后仍然存在”——此处的逻辑不完整且无效;它应该更像是“从堆中分配比在堆栈上分配更方便,因为[我们使用在调用例程返回后仍然存在的内存,并且]它在调用例程返回后仍然存在。”;并非在所有情况下,我们都需要具有这种持久性的内存,在不需要时调用
free
并不更方便,这与断言相反。此外,即使您使用的内存需要比立即函数更长的生命周期,您也有两个其他选择:1/最好(大多数情况下,这应该是您的目标)您应该接受一个指向对象的参数,该对象可以有任何存储持续时间;调用者决定是否需要
malloc
(这是
strcat
sprintf
等的操作方式)和2/还有两个您没有提到的存储持续时间(静态和线程特定),并且没有指定