打印

C解析之三运行时内存分配

[复制链接]
1319|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 elecintop 于 2014-3-29 19:08 编辑

前言:以别样的角度解析C。
      C语言的内存是让很多初学C编程的同学感到混乱与头疼的问题,受此困扰很难对C有清晰全面的把握,打击学习的积极性。然而,一般基础教材对C运行时内存往往避而不谈,高级参考资料的长篇大论同样让人抓不住要点。接下来,我就给各位同学解开C语言运行时内存的面纱。

相关帖子

沙发
elecintop|  楼主 | 2014-3-29 19:08 | 只看该作者
内存空间与房间: 电脑的内存,通常有2G,4G等大小,这些空间由你的操作系统分配给你编写的C程序使用。当C程序运行时,便从操作系统得到一块内存空间,但这块空间怎么分配与管理,是我们要说的重点。类比个人的房间,毫无规则的摆放你的物品将会一团糟,显然我们需要有某种规则以便有条理的摆放与管理你的物品。对C语言而言,这个某种规则便是C语言内存管理机制。

使用特权

评论回复
板凳
elecintop|  楼主 | 2014-3-29 19:09 | 只看该作者
1.分区

使用特权

评论回复
地板
elecintop|  楼主 | 2014-3-29 19:10 | 只看该作者
明确的分区是管理的前提,只有我们确定了房间分那几块区域,才能确定下一步区域摆放哪些物品。确定分区后,我们需要一份清单,记录分类摆放的规则:
           1.代码区:存放程序执行的代码

使用特权

评论回复
5
elecintop|  楼主 | 2014-3-29 19:11 | 只看该作者
2.静态区:全局变量和静态变量(有的同学可能有更深的认识静态区可以 细分为:
    1.非初始化数据段:存放未初始化的全局变量和静态变量。
    2. 初始化的数据:存放初始化的全局变量和静态变量。)

使用特权

评论回复
6
elecintop|  楼主 | 2014-3-29 19:12 | 只看该作者
   3.堆:动态分配区域,malloc, calloc, realloc等函数
   4.空闲内存:堆栈式可延伸的,空闲内存提供堆向下与栈向上需要的空间

使用特权

评论回复
7
elecintop|  楼主 | 2014-3-29 19:13 | 只看该作者
5.栈:局部变量及每次函数调用时返回地址、以及调用者的环境信息
C语言设计了这个规则,并严格的为每个程序分配与管理内存,使程序的运行井然有序。一个物品摆放整齐的房间,寻找某件物品会更快,C语言的内存分配机制同样如此,使其拥有更优良的性能。示例如下:

使用特权

评论回复
8
elecintop|  楼主 | 2014-3-29 19:13 | 只看该作者
2.更多的思考
           变量在内存分配的不同区域,有不同的特性。比如分配在静态区的数据,可以在编译时直接写入代码,以获得更高访问数据的速度。C在堆里分配的空间必须由程序员手动释放,否则会造成内存的泄露等更多进一步的了解。

使用特权

评论回复
9
FAQ| | 2014-3-29 20:46 | 只看该作者
**很好

使用特权

评论回复
10
yanyanyan168| | 2014-3-29 21:11 | 只看该作者
堆和栈的区别还不是很明白

使用特权

评论回复
11
lnhjsdf| | 2014-3-29 22:08 | 只看该作者
支持,希望作者用heap和stack来解释,在结合ARM,ucos,来讲述

使用特权

评论回复
12
651927693| | 2014-3-30 09:00 | 只看该作者
堆是需要你通过明确的函数使用的,比如LZ说的malloc,而栈是实现某些功能隐性使用的,比如函数调用时的入栈和函数返回时的出栈。

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
elecintop + 2
13
elecintop|  楼主 | 2014-4-2 17:10 | 只看该作者
yanyanyan168 发表于 2014-3-29 21:11
堆和栈的区别还不是很明白

还需要学习,哈哈

使用特权

评论回复
14
651927693| | 2014-4-24 00:34 | 只看该作者
引用《Unix环境高级编程》里的段落来解释吧。
栈:自动变量以及每次函数调用时所需保存的信息都存放在此段中
堆:通常在堆中进行动态存储分配。

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
elecintop + 3
15
elecintop|  楼主 | 2014-4-24 17:24 | 只看该作者
651927693 发表于 2014-4-24 00:34
引用《Unix环境高级编程》里的段落来解释吧。
栈:自动变量以及每次函数调用时所需保存的信息都存放在此段 ...

学习了

使用特权

评论回复
16
651927693| | 2014-4-24 17:26 | 只看该作者
LZ谦虚了,其实咱们俩说的都差不多。我只是单纯谈谈我的看法罢了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

176

主题

1329

帖子

3

粉丝