对于编程初学者来说会接触到一些难以理解的名称,比如堆(heap)、栈(stack)、堆栈(stack)等,初学开发过程中往往让人混淆不清。今天我们来谈谈堆和栈的具体区别,来帮助初学者理清思路。

堆和栈的区别一直都是永恒的话题,为此我也查了很多的资料,以防自己的理解错误,而给他人造成理解偏差。

先从简单的一个例子引出堆和栈:void function(){int *p = (int *)malloc(10*sizeof(int));}

  • 这是C语言开发学习过程中,必不可免要学习的知识,动态分配一块空间,空间在堆区大小是40字节(32位系统中)。而定义的指针变量p是局部变量(在栈区中 占用4字节空间),用来存放刚刚前面动态分配的空间的首地址。可以看出,在这一句代码中同时包含了栈和堆,如图所示。

堆和栈我们从以下几个方面比较一下堆和栈:

1

存储内容不同

栈:在函数调用时,栈中存放的是函数中(底下是函数调用后的下一条指令)各个参数(局部变量)。堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。  

2

管理方式上不同

栈:由系统自动分配空间,同时系统自动释放空间。例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间,当对应的生存周期结束后栈空间自动释放。堆:需要程序员手动申请并且手动释放,并指明大小,在C语言中malloc函数申请,释放free函数,在C++中 new和delete实现。  

3

空间大小不同

栈:获取空间较小。在Windows下,一般大小是1M或2M,当剩余栈空间不足时,分配失败overflow。堆:获得空间根据系统的有效虚拟内存有关,比较灵活,比较大。  

4

能否产生碎片不同

栈:不会产生碎片,空间连续。堆:采用的是链表的存储方式,会产生碎片。  

5

生长方向不同

栈:向低地址扩展的数据结构,是一块连续的内存的区域。堆:向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。  

6

分配方式不同

栈:有2种分配方式:静态分配和动态分配,静态由编译器完成,例如局部变量;动态由alloca函数实现,并且编译器会进行释放。堆:都是动态分配的,没有静态分配的堆。  

7

分配效率不同

栈:由系统自动分配,速度较快。但程序员是无法控制的。堆:由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来方便。以上是栈和堆几个方面的不同,希望通过上面的资料可以帮助初学者分清堆和栈。扫码入群扫码添加管理员微信

加入“电子产品世界”粉丝交流群

↓↓↓↓点击,查看更多新闻

c语言 overflow_一文读懂:C语言编程中“堆”和“栈”的七大区别相关推荐

  1. “一文读懂“系列:Android中的硬件加速

    浅谈 前几天有个朋友问我"了不了解关于手机硬件加速方面的知识?",嗯?其实我也想知道... 于是笔者就去网上搜罗了文章再结合自己对源码的理解,总结了这篇关于硬件加速的理解. 关于屏 ...

  2. c语言位向量机伞_一文读懂C语言精华-指针变量和指向指针的指针

    1978年贝尔实验室正式发表C语言,受到众多IT从业者的热捧,即使41年过去了,C语言仍然牢牢占据最受欢迎编程语言前二的位置,许多人的程序开发之路也是从C语言开始的. 编程语言受欢迎排名 C语言简洁紧 ...

  3. 一文读懂什么是Java中的自动拆装箱

    本文主要介绍Java中的自动拆箱与自动装箱的有关知识. 基本数据类型 基本类型,或者叫做内置类型,是Java中不同于类(Class)的特殊类型.它们是我们编程中使用最频繁的类型. Java是一种强类型 ...

  4. java integer valueof_一文读懂什么是Java中的自动拆装箱

    本文主要介绍Java中的自动拆箱与自动装箱的有关知识. 基本数据类型 基本类型,或者叫做内置类型,是Java中不同于类(Class)的特殊类型.它们是我们编程中使用最频繁的类型. Java是一种强类型 ...

  5. 一文读懂Java语言方法的重写(覆盖、Override)

    很多初学Java语言的小伙伴,在学到"面向对象"这块内容的时候,都会学到的一个概念,那就是"方法的重写".重写又叫覆盖,英文名为"Override&q ...

  6. 读懂python语言_一文读懂python反射机制

    反射 反射机制就是在运行时,动态的确定对象的类型,并可以通过字符串调用对象属性.方法.导入模块,是一种基于字符串的事件驱动.解释型语言:程序不需要编译,程序在运行时才翻译成机器语言,每执行一次都要翻译 ...

  7. 一文读懂 shell 脚本编程

    一.shell 脚本基础知识 shell脚本是一个文件,里面存放的是特定格式的指令,系统可以使用脚本解析器翻译或解析指令并执行(无需编译).shell脚本的本质是 shell命令的有序集合 shell ...

  8. 一文读懂:区块链中的Merkle树

    ​我们知道,区块链中每个区块包括区块头和区块体两部分. -------- 个人技术公众号:解决方案工程师 欢迎同领域的朋友关注.相互交流. -------- 像在CSDN一样,分享技术,分享代码,分享 ...

  9. 一文读懂什么是云服务器,和本地服务器的区别,云服务的用途,华为云服务器的获取

    [系列专栏]:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! <QT开发实战> <嵌入式通用开发实战> <从0到1学习嵌入式Linux开发> <A ...

最新文章

  1. Spring Initializr 构建Spring Boot/Cloud工程
  2. 日本推出透明公厕,智能玻璃控制透明度,有人如厕就“屏蔽”外界
  3. 春节充电 | 送你10本机器学习和数据科学必读书(附PDF下载)
  4. Linux内核Makefile
  5. linux 的ip 设置lo_linux网络虚拟化: network namespace 简介及实验
  6. oracle json入参调用ws服务返回请求失败_Spring 5.2.2技术集成 —Spring HTTP调用程序和JAXWS...
  7. 有效沟通bic法则_学好英语的18条黄金法则,强烈推荐给孩子看
  8. Diango博客--2.博客从“裸奔”到“有皮肤”
  9. SLS多云日志采集、处理及分析
  10. React之回调ref中回调执行次数的问题
  11. offsetLeft,Left,clientLeft的区别
  12. TypeScript设计模式之职责链、状态
  13. Mac版IntelliJ IDEA上手的一些必要设置
  14. Python:jieba库的介绍与使用
  15. 将Ubuntu的引导写入自己所在分区——变色龙引导Linux,Windows,Mac OS(苹果系统)攻略之一
  16. NK细胞培养方法与优化解决方案
  17. 网吧游戏服务器虚拟机,用虚拟机亲自体验网咖无盘系统,终于知道网咖系统快的原因了...
  18. 分门别类刷leetcode——栈、队列、堆(C++实现)
  19. 腾讯云运维干货沙龙-海量运维实践大曝光 (一)
  20. 石头、纸、剪刀小游戏(剪刀石头布?)

热门文章

  1. UVA11774 Doom‘s Day【数学规律+GCD】
  2. JSK-4 简单斐波那契【基础+打表+记忆化递归】
  3. POJ3614 Sunscreen【贪心】
  4. HDU3787 A+B【进制】
  5. 树莓派与 Python —— GPIO
  6. 英语词汇辨异 —— 形近字、近义词
  7. C++ 标准库 —— random
  8. HBase 的(伪)分布式安装
  9. vfp中treeview右键菜单_用卓语言程序把Sublime Text 3添加到和删除出右键菜单
  10. win7安装python3.6_Win7 64位下python3.6.5安装配置图文教程