C语言内存机制

最近有参加一些C/C++类的面试,感觉笔试的题目大都偏重于考察基本原理,这对我来说是一个不小的挑战.平时学习的时候往往忽视了那些基本原理,急于动手去实践,结果忽视了灵魂性的东西.今后的学习中,禁忌一味动手写代码,要结合理论多思考,多问些为什么,不然就真成为了代码民工了,知其然,知其所以然,才能成为大师.

关于C的内存区域,大家基本上都把它划分为五部分,下面就一起去认识这些我们经常打交道却很少研究的五个区域.

我们首先从最浅显的区域说起,当大家遇到一个诸如so easy A+B的问题时会三下五去二的把程序写完,那这些程序是不是也需要一个地方来存放呢?对的,在C语言中有存贮C程序的区域,称为程序代码区.

在写程序时,字符串可谓是相当的活跃,字符串在大部分C程序中都有很大的比重,因此在C内存机制中,特别有一块存放字符串常量的区域,被称为C风格字符串常量存储区,在程序结束时,由系统自动收回.

接下来的三种就存在我们写程序的过程中了,在我们写一些功能较强的C程序时,往往需要多个功能函数,有的变量需要贯穿多个函数模块所以我们把这些变量定义为全局变量.当我们把变量定义为全局变量时,系统便把这些变量存放在专用的全局变量区.其中,需要注意的是static修饰的变量在内存中和全局变量是存放在一个地方的,因此我们习惯称这部分为全局变量和静态变量存放区,简称静态区和全局区.

当我们在main函数或者其他函数中定义一个变量的时候,觉得我们并没有刻意为这些变量来分配内存.恩,其实我们在定义这些局部变量的时候,系统自动的便根据我们的数据类型来在指定的区域内分配了内存.我们一般称这个指定的内存区域为栈.栈除了存放我们局部变量还有函数的实参.

在我们构造链表的节点时,会为新节点来 malloc一个新的节点区域,这样我们用malloc来手动分配内存的区域被称为堆.当你申请内存的时候也许很随意,但一定要记得不用的时候free掉这些内存,否则便会造成C++中著名的内存泄漏问题.最后在提醒大家,即使申请了内存而且不用的时候及时的释放了,还是不要太频繁,不然这样来来回回又会造成内存碎片的问题.

经过上面的总结,我们可以把C的存储区域简单明确的归纳为:

  1. 程序代码区      C二进制代码
  2. 常量存储区      C字符串形常量
  3. 全局/静态区     全局变量/静态变量
  4. 栈          局部变量/函数实参
  5. 堆          程序员手动分配内存                                            

参考资料  

下面着重分析下堆和栈.

堆和栈是我们比较常用的内存区域,一般来说我们定义的局部变量更多一些,所以栈的使用更为频繁.而且栈和堆相比,栈的存取更高效,这是因为我们的计算机从构架上就直接对栈有了支持,有专用的寄存器来维护数据在栈内的进出.而对于堆来说,计算机本身是不支持的,它是靠一些库函数来操作的,因此在效率上要慢一些.

但为什么我们还需要堆,这是因为栈可以定义的数据类型也就是计算机直接支持的,比如整形/浮点型/字符型等,数据类型比较单一,而堆的数据面更广一点.         

转载于:https://www.cnblogs.com/heat-man/articles/4067981.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值