你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

C语言栈和堆几个方面的不同

[复制链接]
gaosmile 发布时间:2020-6-19 11:07
对于编程初学者来说会接触到一些难以理解的名称,比如堆(heap)、栈(stack)、堆栈(stack)等,初学开发过程中往往让人混淆不清。

7 Y- S! [* c* Z; V2 D" y0 q4 q4 u
对于编程初学者来说会接触到一些难以理解的名称,比如堆(heap)、栈(stack)、堆栈(stack)等,初学开发过程中往往让人混淆不清。今天我们来谈谈堆和栈的具体区别,来帮助初学者理清思路。

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

/ g& [& N4 ?+ \% q% s2 p5 y6 u9 M
先从简单的一个例子引出堆和栈:
1 e; ~1 v$ Z7 N  w! Y
void function(){
 int *p = (int *)malloc(10*sizeof(int));
}
  
这是C语言开发学习过程中,必不可免要学习的知识,动态分配一块空间,空间在堆区大小是40字节(32位系统中)。而定义的指针变量p是局部变量(在栈区中 占用4字节空间),用来存放刚刚前面动态分配的空间的首地址。可以看出,在这一句代码中同时包含了栈和堆,如图所示。
/ i9 `- u4 D/ `3 ^1 W: t
微信图片_20200619110653.png   
. e9 `2 Y: ]: L/ ]9 j我们从以下几个方面比较一下堆和栈:  
. C  N$ m; Y0 f) h1 存储内容不同5 l$ j  {6 R9 i2 e& p+ y
; \* l* \' W. ^1 R) u
栈:在函数调用时,栈中存放的是函数中(底下是函数调用后的下一条指令)各个参数(局部变量)。4 O4 p: |; x8 H$ j. L7 `) W5 ~
堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。  
9 f' d+ Q. @$ ~# s2 管理方式上不同
; B$ r6 m2 P$ E. X/ r! H0 p+ K% g$ Z: h/ L0 i( A7 @% ^
栈:由系统自动分配空间,同时系统自动释放空间。例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间,当对应的生存周期结束后栈空间自动释放。5 K1 P# ]; A) W8 f
# ?6 v4 n% c& e
堆:需要程序员手动申请并且手动释放,并指明大小,在C语言中malloc函数申请,释放free函数,在C++中 new和delete实现。  
# X1 ~9 W  r6 l; L' b8 [& e4 d/ _3 空间大小不同
6 W( p% @# G9 M) e, U( O2 f8 T1 G8 H
栈:获取空间较小。在Windows下,一般大小是1M或2M,当剩余栈空间不足时,分配失败overflow。
1 w2 M+ E! v) s& D, [  堆:获得空间根据系统的有效虚拟内存有关,比较灵活,比较大。  8 P7 K' v$ Z4 H8 G2 ]$ e
4 能否产生碎片不同  o# W/ Y: Y- O2 R3 v& [% O
6 W# X: z+ P* i1 b
栈:不会产生碎片,空间连续。
/ [0 U9 z2 ~- }+ H, M  c2 V
; m# C6 G8 x& J
堆:采用的是链表的存储方式,会产生碎片。  * c+ o/ {# Q/ H
5 生长方向不同, O" H. o8 N! K7 b8 j& ?

" e2 Q$ d4 y8 a# z: u/ I2 O/ p. f栈:向低地址扩展的数据结构,是一块连续的内存的区域。
( E7 M8 D! p' k  堆:向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。  
9 u1 r2 _9 e6 E5 q( {( p# y6 分配方式不同
! _$ O" h3 l! c) S1 u+ G2 |1 n8 d% s
栈:有2种分配方式:静态分配和动态分配,静态由编译器完成,例如局部变量;动态由alloca函数实现,并且编译器会进行释放。
" O* Z: D5 V9 r) P! B: Y" e  堆:都是动态分配的,没有静态分配的堆。  
0 T- ]2 i, t  q  _7 分配效率不同
' p) \& W$ ]0 n  Y
5 H6 A* w" f( s) ?/ b栈:由系统自动分配,速度较快。但程序员是无法控制的。
  P6 K: ^0 O6 g# Z9 a) a. E  堆:由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来方便。  以上是栈和堆几个方面的不同,希望通过上面的资料可以帮助初学者分清堆和栈。% d8 ?/ X( C6 E% b4 J+ [/ Y& Q- Y  ~
赞 收藏 评论1 发布时间:2020-6-19 11:07

举报

1个回答
mmuuss586 回答时间:2020-6-19 11:33:42
感谢分享
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版