c语言 overflow_一文读懂: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
能否产生碎片不同
栈:不会产生碎片,空间连续。堆:采用的是链表的存储方式,会产生碎片。
5
生长方向不同
栈:向低地址扩展的数据结构,是一块连续的内存的区域。堆:向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。
6
分配方式不同
栈:有2种分配方式:静态分配和动态分配,静态由编译器完成,例如局部变量;动态由alloca函数实现,并且编译器会进行释放。堆:都是动态分配的,没有静态分配的堆。
7
分配效率不同
栈:由系统自动分配,速度较快。但程序员是无法控制的。堆:由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来方便。以上是栈和堆几个方面的不同,希望通过上面的资料可以帮助初学者分清堆和栈。扫码入群扫码添加管理员微信
加入“电子产品世界”粉丝交流群
↓↓↓↓点击,查看更多新闻
c语言 overflow_一文读懂:C语言编程中“堆”和“栈”的七大区别相关推荐
- “一文读懂“系列:Android中的硬件加速
浅谈 前几天有个朋友问我"了不了解关于手机硬件加速方面的知识?",嗯?其实我也想知道... 于是笔者就去网上搜罗了文章再结合自己对源码的理解,总结了这篇关于硬件加速的理解. 关于屏 ...
- c语言位向量机伞_一文读懂C语言精华-指针变量和指向指针的指针
1978年贝尔实验室正式发表C语言,受到众多IT从业者的热捧,即使41年过去了,C语言仍然牢牢占据最受欢迎编程语言前二的位置,许多人的程序开发之路也是从C语言开始的. 编程语言受欢迎排名 C语言简洁紧 ...
- 一文读懂什么是Java中的自动拆装箱
本文主要介绍Java中的自动拆箱与自动装箱的有关知识. 基本数据类型 基本类型,或者叫做内置类型,是Java中不同于类(Class)的特殊类型.它们是我们编程中使用最频繁的类型. Java是一种强类型 ...
- java integer valueof_一文读懂什么是Java中的自动拆装箱
本文主要介绍Java中的自动拆箱与自动装箱的有关知识. 基本数据类型 基本类型,或者叫做内置类型,是Java中不同于类(Class)的特殊类型.它们是我们编程中使用最频繁的类型. Java是一种强类型 ...
- 一文读懂Java语言方法的重写(覆盖、Override)
很多初学Java语言的小伙伴,在学到"面向对象"这块内容的时候,都会学到的一个概念,那就是"方法的重写".重写又叫覆盖,英文名为"Override&q ...
- 读懂python语言_一文读懂python反射机制
反射 反射机制就是在运行时,动态的确定对象的类型,并可以通过字符串调用对象属性.方法.导入模块,是一种基于字符串的事件驱动.解释型语言:程序不需要编译,程序在运行时才翻译成机器语言,每执行一次都要翻译 ...
- 一文读懂 shell 脚本编程
一.shell 脚本基础知识 shell脚本是一个文件,里面存放的是特定格式的指令,系统可以使用脚本解析器翻译或解析指令并执行(无需编译).shell脚本的本质是 shell命令的有序集合 shell ...
- 一文读懂:区块链中的Merkle树
我们知道,区块链中每个区块包括区块头和区块体两部分. -------- 个人技术公众号:解决方案工程师 欢迎同领域的朋友关注.相互交流. -------- 像在CSDN一样,分享技术,分享代码,分享 ...
- 一文读懂什么是云服务器,和本地服务器的区别,云服务的用途,华为云服务器的获取
[系列专栏]:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! <QT开发实战> <嵌入式通用开发实战> <从0到1学习嵌入式Linux开发> <A ...
最新文章
- Spring Initializr 构建Spring Boot/Cloud工程
- 日本推出透明公厕,智能玻璃控制透明度,有人如厕就“屏蔽”外界
- 春节充电 | 送你10本机器学习和数据科学必读书(附PDF下载)
- Linux内核Makefile
- linux 的ip 设置lo_linux网络虚拟化: network namespace 简介及实验
- oracle json入参调用ws服务返回请求失败_Spring 5.2.2技术集成 —Spring HTTP调用程序和JAXWS...
- 有效沟通bic法则_学好英语的18条黄金法则,强烈推荐给孩子看
- Diango博客--2.博客从“裸奔”到“有皮肤”
- SLS多云日志采集、处理及分析
- React之回调ref中回调执行次数的问题
- offsetLeft,Left,clientLeft的区别
- TypeScript设计模式之职责链、状态
- Mac版IntelliJ IDEA上手的一些必要设置
- Python:jieba库的介绍与使用
- 将Ubuntu的引导写入自己所在分区——变色龙引导Linux,Windows,Mac OS(苹果系统)攻略之一
- NK细胞培养方法与优化解决方案
- 网吧游戏服务器虚拟机,用虚拟机亲自体验网咖无盘系统,终于知道网咖系统快的原因了...
- 分门别类刷leetcode——栈、队列、堆(C++实现)
- 腾讯云运维干货沙龙-海量运维实践大曝光 (一)
- 石头、纸、剪刀小游戏(剪刀石头布?)
热门文章
- UVA11774 Doom‘s Day【数学规律+GCD】
- JSK-4 简单斐波那契【基础+打表+记忆化递归】
- POJ3614 Sunscreen【贪心】
- HDU3787 A+B【进制】
- 树莓派与 Python —— GPIO
- 英语词汇辨异 —— 形近字、近义词
- C++ 标准库 —— random
- HBase 的(伪)分布式安装
- vfp中treeview右键菜单_用卓语言程序把Sublime Text 3添加到和删除出右键菜单
- win7安装python3.6_Win7 64位下python3.6.5安装配置图文教程