在了解堆与栈之前,我们想来了解下程序的内存分配

一个编译的程序占用的内存分为以下几个部分  :
  1、栈区(stack)—   由编译器自动分配释放   ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。  
  2、堆区(heap)   —   一般由程序员分配释放,  若程序员不释放,程序结束时可能由OS回 收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。  
  3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另  
  一块区域。程序结束后由系统释放。  
  4、文字常量区   —常量字符串就是放在这里的。   程序结束后由系统释放  
  5、程序代码区—存放函数体的二进制代码。

简单的可以理解为:
heap:是由malloc之类函数分配的空间所在地。地址是由低向高增长的。
stack:是自动分配变量,以及函数调用的时候所使用的一些空间。地址是由高向低减少的。

例子程序

这是一个前辈写的,非常详细

int a = 0; //<全局初始化区
char *p1;//<全局未初始化区
main()
{int b; //<栈char s[] = "abc"; //<栈char *p2; //<栈char *p3 = "123456"; //<123456在常量区,p3在栈上。static int c =0;//< 全局(静态)初始化区p1 = (char *)malloc(10);p2 = (char *)malloc(20);//分配得来得10和20字节的区域就在堆区。strcpy(p1, "123456"); //123456放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
}

申请方式

stack: 由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间

heap: 需要程序员自己申请,并指明大小。

如 p1 = (char *)malloc(10); p2 = (char *)malloc(20); 但是注意p1、p2本身是在栈中的。

请后系统的响应

栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。

堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时, 会遍历该链表,

寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,

另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。

另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。

申请大小的限制

栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。

堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。

堆和栈中的存储内容

栈: 在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。 当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。

堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。

其他扩展

【STM32 大小端模式 与 堆栈及其增长方向分析】http://www.openedv.com/posts/list/24152.htm

【程序编译后运行时的内存分配-转】http://blog.sina.com.cn/s/blog_5420e0000101a0w1.html

转载于:https://www.cnblogs.com/libra13179/p/10629298.html

【浅说】堆(heap)和栈(stack)区别相关推荐

  1. bss段,data段、text段、堆heap和栈stack

    bss段,data段.text段.堆heap和栈stack bss段 data段 text段 堆(heap) 栈(stack) 例子 在C的学习中,你总避免不了对各类数据的存储区域学习归纳总结,简单的 ...

  2. JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )(转发)

    这两天看了一下深入浅出JVM这本书,推荐给高级的java程序员去看,对你了解JAVA的底层和运行机制有 比较大的帮助. 废话不想讲了.入主题: 先了解具体的概念: JAVA的JVM的内存可分为3个区: ...

  3. (深入理解计算机系统) bss段,data段、text段、堆(heap)和栈(stack)(C/C++存储类型总结)(内存管理)

    文章目录 bss段 data段 text段 堆(heap) 栈(stack) 一个程序本质上都是由 bss段.data段.text段三个组成的. 存储类型总结 bss段 bss段(bss segmen ...

  4. JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )

    JAVA的JVM的内存可分为3个区:堆(heap).栈(stack)和方法区(method) 堆区: 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指 ...

  5. JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )(转载)

    想想面试的时候很多会问jvm这方面的问题虽然还是菜鸟不太能用到现在但是还是了解一下, 找资料的时候看见个大佬写的很好转载到这方便以后自己复习和给大佬做宣传 以下为大佬的博客原文: 这两天看了一下深入浅 ...

  6. 堆(heap)和栈(stack)有什么区别??

    简单的可以理解为: heap:是由malloc之类函数分配的空间所在地.地址是由低向高增长的. stack:是自动分配变量,以及函数调用的时候所使用的一些空间.地址是由高向低减少的. 预备知识-程序的 ...

  7. Java堆(heap)、栈(stack)和队列的区别

    Java里面Stack有两种含义: 一:数据结构 Stack,即java.util.Stack import java.util.Stack; import java.util.Iterator; i ...

  8. BSS段 data段 text段 堆heap 和 栈stack

    BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配.     ...

  9. 堆(heap)和栈(stack)有什么区别

    简单的可以理解为: heap:是由malloc之类函数分配的空间所在地.地址是由低向高增长的. stack:是自动分配变量,以及函数调用的时候所使用的一些空间.地址是由高向低减少的. 程序的内存分配 ...

  10. java堆内存与栈内存区别

    栈(stack): 是一个先进后出的数据结构,通常用于保存方法(函数)中的参数,局部变量. 在java中,所有基本类型和引用类型都在栈中存储.栈中数据的生存空间一般在当前scopes内(就是由{... ...

最新文章

  1. 有了它,AI甚至可以让你知道对方是否真的爱你?
  2. 告别2010,迎来2011
  3. PostgreSQL学习手册(五) 函数和操作符
  4. textarea选中行删除_如何一键删除表格空行,这个方法才最高级!
  5. 好久不碰Blog,最近要二次毕业了,继续写点警醒自己的话
  6. jsch设置代理_尽管在JSch中设置了STRICT_HOST_CHECKING,但仍获取UnknownHostKey异常
  7. 2018焦作网络赛 - Poor God Water 一道水题的教训
  8. easyUI表单验证扩展
  9. poj Gone Fishing 枚举加贪心 当初做的很纠结啊!!终于A了,与大家分享一下经验
  10. Java进阶:微服务SpringCloud
  11. android开发歌词滑动效果_一些Flutter开发中的“坑”
  12. 中国支付清算发展简史
  13. 阿里巴巴java开发手册心得_阿里巴巴JAVA开发手册总结
  14. PC通过adb连接手机 无需root连接 需要root连接
  15. Vue2.0+Vue3.0全套教程
  16. html让登录框3d,CSS3实现3D旋转动态显示登录注册
  17. linux udp 端口测试,RAKsmart:Linux下TCP/UDP 端口测试及验证方法说明
  18. 事态升级管理程序范本_项目管理事态升级流程
  19. XGBoost原理介绍
  20. day fit into much one too_PGone Talking too much歌词

热门文章

  1. 使用TryUpdateModel进行数据更新
  2. [[UIScreen mainScreen] bounds] 返回的屏幕尺寸不对
  3. 2008中国最佳寓言
  4. python load
  5. 【ResNet】ResNet到底在解决一个什么问题呢?
  6. 如何高效并快速的掌握NLP与深度学习路径?来公众号寻找经验吧~
  7. 教练级导师带你打5场AI大赛,还有奖金5万元的工业级AI实战赛等你来战!
  8. 如何用简单易懂的例子解释隐马尔可夫模型?(进阶篇)
  9. 这份字节、阿里内部秘传的面经,被我搞到手了……
  10. 每日算法系列【LeetCode 556】下一个更大元素 III