找回密码
 注册
查看: 483|回复: 2
打印 上一主题 下一主题

C语言中的动态内存-----栈内存

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-10-18 13:38 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
C语言程序的动态内存分为栈内存区域和堆内存区域两种。栈内存是由编译器管理的,而堆内存是由程序调用具体的库函数管理的。我们今天分析下栈内存的概念。
8 Z, A( @+ k7 }! v8 X( X1 a3 g/ v9 u- L' _% r( _

: v$ b8 n2 [! K0 f5 h7 r  L. L3 y& ]6 c栈内存的使用在很大程度上依赖于处理器的硬件机制。在处理器中,一般有一个寄存器来表示当前栈指针的位置,通常在内存中分配一块区域,这块内存的上界(高内存地址)和下界(低内存地址)之间是可用的栈内存区域。
9 n# ~# R2 h; U7 _# m5 Q  I7 y* B
( l" Q7 Q; X( @7 r, x6 M栈指针是一个指向栈区域内部的指针,也就是它的值是一个地址,这个地址位于栈区的下界和栈区的上界之间。栈指针把这个栈区域分为两个部分,一个是已经使用的区域,一个是没有使用的区域。
* n! Z* i  Q+ |# c$ a5 a: b
; A7 S( e6 U3 l; Y! M对于栈内存的增长方向有两种:一种是向上增长的,也就是低地址向高地址增长;另一个是向下增长的,高地址向低地址增长。在目前常见的体系结构和编译系统中,栈大多是向下增长的,我们也是看下这种常见的增长形式。在初始阶段,栈指针是指向栈区间的上界。随着栈使用量的增加,栈指针的值将向低地址移动,也就是在变小。
$ `# a0 O- h- J* |+ [! y: B: X6 {  q- A3 g
栈内存在使用过程中有一个重要的特性是先入后出,也就是后入栈的内容将先出栈,而先入栈的后出栈。类似于一个口的瓶子,先进去的在底下,要想底下的出来就先把上面的先倒出来。栈内存的使用情况见下图:' _6 T0 Y  }1 ^0 k  N3 Y

' e8 R! u( c2 {* v入栈的过程和出栈的过程我们安全用图形来表示,更形象些吧~
0 h# a% o( D( c, C9 c1 G9 x4 ]
5 ?  d% z) p' f
' ~1 d+ \3 t( r0 }7 k
在入栈的过程中,如果栈指针的变化超出栈内存的区域,将发生栈溢出。
  q  V6 z. q  b( j# b/ g: o. s- X# G/ g
从图中看出栈指针的功能是标识当前的栈位置。对栈内存处理中,每次能够获取的内容都是最后可放入栈内存的内容,而每次放入栈内存中的内容都将位于栈区域的最后。2 W9 H0 l! k2 o) V0 J6 j& W' K
' D; j- C. }& D$ K) P" _
总的来说其实栈是一个先入后出的内存区域,栈指针是提供一种硬件的内存机制。* o0 k: V" F' c5 w% x- ~
  z  r1 T5 N, k
还有一个大家可能都没听说过,或者都没关注过的,我们来一起了解一下,就是满栈和空栈的概念,我们还是通过图来形容一下,这个是由处理器的体系结构决定的。与程序的编写没有关系,甚至编译器都不需要关注这个问题。无论在哪种情况下,栈指针都是已经使用的栈区域和未使用的栈区域的分界线。
6 x5 ?" k" a7 r
& K- Z5 }7 V5 X% }, c9 k 5 S* y% Q; F( F' R. @1 o
在满栈的情况:栈指针当前的位置是已经使用的栈区域。" X( {( i/ n8 M' R" C9 B+ A

* j2 J1 k; u8 o# a在空栈的情况:栈指针当期的位置是没有使用的栈区域。
3 a1 e6 @/ g8 }, a
: u. Y; i+ X4 l. O/ n7 r( }& l这个仅供大家了解下就可以了,毕竟对于我们大多数人来说都是应用者,多了解点底层的总没错,但也不必太深挖。对于栈内存的概念我就分享到这里,其实这个对于写汇编的人来说就很有用处了,或者去多读一些汇编就很能清楚栈内存的妙用了。后续我分享堆内存的一些概念,话说知识是一点点积累的过程,有时候觉得前面有的知识点懵懵懂懂的突然连起来就又通透了。这就是坚持学习的作用,希望大家都能坚持多学,才能更会用。
: l- b; P  m5 i& f; j

3 p5 \  ]& C2 u: |& N# N3 G0 c
8 w/ ?0 J9 u1 |2 r

( V. X! X$ c) |' T- q
" E6 }% D  ^" ^* h( @# @8 c

该用户从未签到

2#
发表于 2021-10-18 14:27 | 只看该作者
栈内存的使用在很大程度上依赖于处理器的硬件机制

该用户从未签到

3#
发表于 2021-10-18 17:13 | 只看该作者
在入栈的过程中,如果栈指针的变化超出栈内存的区域,将发生栈溢出。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-6-1 16:35 , Processed in 0.078125 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表