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

[复制链接]
1766|15
 楼主| elecintop 发表于 2014-3-29 19:07 | 显示全部楼层 |阅读模式
本帖最后由 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.代码区:存放程序执行的代码
 楼主| elecintop 发表于 2014-3-29 19:11 | 显示全部楼层
2.静态区:全局变量和静态变量(有的同学可能有更深的认识静态区可以 细分为:
    1.非初始化数据段:存放未初始化的全局变量和静态变量。
    2. 初始化的数据:存放初始化的全局变量和静态变量。)
 楼主| elecintop 发表于 2014-3-29 19:12 | 显示全部楼层
   3.堆:动态分配区域,malloc, calloc, realloc等函数
   4.空闲内存:堆栈式可延伸的,空闲内存提供堆向下与栈向上需要的空间
 楼主| elecintop 发表于 2014-3-29 19:13 | 显示全部楼层
5.栈:局部变量及每次函数调用时返回地址、以及调用者的环境信息
C语言设计了这个规则,并严格的为每个程序分配与管理内存,使程序的运行井然有序。一个物品摆放整齐的房间,寻找某件物品会更快,C语言的内存分配机制同样如此,使其拥有更优良的性能。示例如下:

本帖子中包含更多资源

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

×
 楼主| elecintop 发表于 2014-3-29 19:13 | 显示全部楼层
2.更多的思考
           变量在内存分配的不同区域,有不同的特性。比如分配在静态区的数据,可以在编译时直接写入代码,以获得更高访问数据的速度。C在堆里分配的空间必须由程序员手动释放,否则会造成内存的泄露等更多进一步的了解。
FAQ 发表于 2014-3-29 20:46 来自手机 | 显示全部楼层
**很好
yanyanyan168 发表于 2014-3-29 21:11 | 显示全部楼层
堆和栈的区别还不是很明白
lnhjsdf 发表于 2014-3-29 22:08 | 显示全部楼层
支持,希望作者用heap和stack来解释,在结合ARM,ucos,来讲述
651927693 发表于 2014-3-30 09:00 来自手机 | 显示全部楼层
堆是需要你通过明确的函数使用的,比如LZ说的malloc,而栈是实现某些功能隐性使用的,比如函数调用时的入栈和函数返回时的出栈。

评分

参与人数 1威望 +2 收起 理由
elecintop + 2

查看全部评分

 楼主| elecintop 发表于 2014-4-2 17:10 | 显示全部楼层
yanyanyan168 发表于 2014-3-29 21:11
堆和栈的区别还不是很明白

还需要学习,哈哈
651927693 发表于 2014-4-24 00:34 | 显示全部楼层
引用《Unix环境高级编程》里的段落来解释吧。
栈:自动变量以及每次函数调用时所需保存的信息都存放在此段中
堆:通常在堆中进行动态存储分配。

评分

参与人数 1威望 +3 收起 理由
elecintop + 3

查看全部评分

 楼主| elecintop 发表于 2014-4-24 17:24 | 显示全部楼层
651927693 发表于 2014-4-24 00:34
引用《Unix环境高级编程》里的段落来解释吧。
栈:自动变量以及每次函数调用时所需保存的信息都存放在此段 ...

学习了
651927693 发表于 2014-4-24 17:26 | 显示全部楼层
LZ谦虚了,其实咱们俩说的都差不多。我只是单纯谈谈我的看法罢了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

176

主题

1329

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部