一,malloc free 函数

malloc()和free()的基本概念以及基本用法:

malloc()函数的工作机制:

    malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足 用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传 给用户,并将剩下的那块(如果有的话)返回到连接表上。调用free函数时,它将用户释放的内存块连接到空闲链上。到最后,空闲链会被切成很多的小内存片 段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检 查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。

 

 

例子一:

char *str = (char *) malloc(100);
   strcpy(str, "hello");
   free(str);
   if(str != NULL)
   {
    strcpy(str, "world");
    printf(str);
   }

  输出:world

---------------------------------------------
free 的解释:

free 函数只有一个参数,就是所要释放的内存块的首地址。比如上例:free(p);

free 函数看上去挺狠的,但它到底作了什么呢?其实它就做了一件事:斩断指针变量与这块内存的关系。

函数就是把这块内存和 p 之间的所有关free系斩断。从此 p 和那块内存之间再无瓜葛。
至于指针变量 p 本身保存的地址并没有改变,但是它对这个地址处的那块内存却已经没有所有权了。
那块被释放的内存里面保存的值也没有改变,只是再也没有办法使用了。这就是 free 函数的功能。
注意:内存释放之后
既然使用 free 函数之后指针变量 p 本身保存的地址并没有改变,那我们就需要重新把 p的值变为 NULL:p = NULL;
这个 NULL 就是我们前面所说的“栓野狗的链子” 如果你不栓起来迟早会出问题的。
如:
在 free(p)之后,你用 if(NULL != p)这样的校验语句还能起作用吗?
例如:
char *p = (char *) malloc(100);
strcpy(p, “hello”);
free(p);
/* p 所指的内存被释放,但是 p 所指的地址仍然不变 */
?
if (NULL != p)
{
/* 没有起到防错作用 */
strcpy(p, “world”);
/* 出错 */
}
释放完块内存之后,没有把指针置 NULL,这个指针就成为了“野指针”,也有书叫“悬垂指针”。这是很危险的,而且也是经常出错的地方。
所以一定要记住一条:free 完之后,一定要给指针置 NULL。

     

    malloc函数的实质体现在:它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足 用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传 给用户,并将剩下的那块(如果有的话)返回到连接表上。调用free函数时,它将用户释放的内存块连接到空闲链上。到最后,空闲链会被切成很多的小内存片 段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检 查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。

    1、函数原型及说明:

    void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一

    个空指针(NULL)。

    关于分配失败的原因,应该有多种,比如说空间不足就是一种。

    void free(void *FirstByte): 该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值