说说C中的malloc和free

malloc是申请一块内存,free是释放一块内存!

说到内存,必然要说指针,指针指向某块内存嘛。

如:某函数内定义一个指针变量,并为其申请一块内存,让这个指针指向这块内存!此时,指针变量本身存在函数的栈区(调用函数时,创建栈区;调用结束时,栈区销毁)

      而这块内存是存放在堆区的!这里有个错误的结论:函数调用结束时,在栈内的指针销毁的同时,它指向的内存也被销毁!它们是没有关系的,堆区内存的释放是由

     free完成的!

     同样,若是先用free释放指针指向的内存空间,这个指针也还是存在的!此时,这个指针所指的内存空间没有被编译器指定(即是无效的)!故,如果通过指针直接访问这块

    内存会出错!

     这里说下编译器的作用,程序在编译的时候,由编译器指定内存单元(虚拟内存单元),当程序加载到内存后才会分配内存单元(物理内存),由虚拟内存地址到

    物理内存地址的转换是由pt表映射完成的。pt表是在什么时候创建的呢?当程序申请并获得PCB(进程控制块)后,会创建一个pt表(包括本程序中用到的所有变量是如何分配  

    空间的,以及变量的特性(由pt表项的标志位标识),如只读.....),程序的几个段区(stack,heap,bbs, readonly,data, text)都是在虚拟内存中划分的!

   回到上个话题,如果有一块内存,编译器不知道,那么这块内存就是不可访问的!(正着说,编译器为程序中的变量指定内存单元,指定的内存都是用到的,没指定的自然也用

   不到)。

  所以当某个指针所指的内存单元被释放后,为防止这个指针在后面继续访问此处,可把指针置为NULL(由系统保证空指针不指向任何实际的对象或者函数。反过来说,任何对象或者函数的地址都不可能是空指针。)

       (.........待续)

     

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值