C语言编程中的“堆”和“栈”七大不同之处
对于编程初学者来说会接触到一些难以理解的名称,比如堆(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、能否产生碎片不同
栈:不会产生碎片,空间连续。
堆:采用的是链表的存储方式,会产生碎片。
小编给大家推荐一个学习氛围超好的地方,C/C++交流企鹅裙:【8.7.0+九.六.三+2.5.1】适合在校大学生,小白,想转行,想通过这个找工作的加入。裙里有大量学习资料,有大神解答交流问题,每晚都有免费的直播课程
5、生长方向不同
栈:向低地址扩展的数据结构,是一块连续的内存的区域。
堆:向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。
6、分配方式不同
栈:有2种分配方式——静态分配和动态分配。静态由编译器完成,例如局部变量;动态由alloca函数实现,并且编译器会进行释放。
堆:都是动态分配的,没有静态分配的堆。
7、分配效率不同
栈:由系统自动分配,速度较快。但程序员是无法控制的。
堆:由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来方便。
以上是栈和堆几个方面的不同,希望通过上面的资料可以帮助初学者分清堆和栈。
C语言编程中的“堆”和“栈”七大不同之处相关推荐
- c语言获取系统剩余内存_C语言编程中的“堆”和“栈”七大不同之处
更多精彩,请点击上方蓝字关注我们! 对于编程初学者来说会接触到一些难以理解的名称,比如堆(heap).栈(stack).堆栈(stack)等.初学开发过程中往往让人混淆不清.今天我们来谈谈堆和栈的具体 ...
- (十一)C语言中内存堆和栈的区别
在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到.但对于很多的初学着来说,堆栈是一个很模糊的概念. 堆栈:一种数据结构.一个在程序运行时用于存放的地方,这可能是很多初学者的认 ...
- Jvm(29),理解升级----C语言中的堆和栈的区别 (可以借鉴)
假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境,那么现在请我们一起开启提升技术之旅吧,详情 ...
- java 堆和栈 数据结构_数据结构的栈和堆和程序中的堆和栈
在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到.但对于很多的初学着来说,堆栈是一个很模糊的概念.堆栈:一种数据结构.一个在程序运行时用于存放的地方,这可能是很多初学者的认识 ...
- 嵌入式开发中的堆与栈
关注.星标公众号,直达精彩内容 文章内容出处:网路素材 整理:李肖遥 0.前言 堆(Heap)与栈(Stack)是开发人员必须面对的两个概念,在理解这两个概念时,需要放到具体的场景下,因为不同场景下, ...
- c语言中错误executing,C语言编程中常见问题解读.doc
C语言编程中常见问题解读 为什么vc6打开的文件却不能编译1 为什么一个vc6工程中有两个main函数不能编译成功?我想写两个程序怎么办?2 为什么v6不能编译程序,生成信息说compile和link ...
- 《C语言解惑》—— 第一篇 C语言编程中的对与错
本节书摘来自华章出版社<C语言解惑>一 书中的第1章,第1.1节,作者:刘振安 刘燕君,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 第一篇 C语言编程中的对 ...
- 请描述定时器初值的计算方式_单片机C语言编程中定时器初值计算的两种方法...
单片机C语言编程中,定时器的初值对于初学者真的是比较不好计算,因此我总结了以下几种方法. 第1种方法: #define FOSC 11059200L //晶振的频率 #define TIMS (655 ...
- Java中的堆和栈的区别
当一个人开始学习Java或者其他编程语言的时候,会接触到堆和栈,由于一开始没有明确清晰的说明解释,很多人会产生很多疑问,什么是堆,什么是栈,堆和栈有什么区别?更糟糕的是,Java中存在栈这样一个后进先 ...
最新文章
- 2018年强化学习领域十篇重要论文(附源码)
- NB-IOT来了,物联网时代才真正来临
- Cygwin编译cef
- ironpython使用opencv_连这些都不知道,就别说自己懂Python!
- dependencies与dependencyManagement的区(转自:http://blog.csdn.net/liutengteng130/article/details/46991829)
- 很好的PHP分页类(调试过)
- [react] 怎样在react中使用innerHTML?
- r3 4300u r5 u_R5刀粒
- 十年磨一剑,王坚自研的MaxCompute如何解决世界级算力难题
- Powershell About Active Directory Group Membership of a domain user
- Asp.Net 网站一键部署技术(下)
- SQL Server中的窗口函数
- java 文件流传输_java – 将远程文件流式传输到文件对象中
- 常见的绩效管理系统有哪些功能?
- 电子邮件 e-mail原理
- 计算机 就业率低,大学里“最坑人”的4个专业,热门只是假象,实则就业率很低...
- Excise_day01
- 学习笔记 time模块练习 纪念日计算
- 【Sprint3冲刺之前】敏捷团队绩效考核(刘铸辉)
- win10 解决:无法访问网络地址