码迷,mamicode.com
首页 > 编程语言 > 详细

c语言中free函数的理解

时间:2016-10-27 01:39:27      阅读:888      评论:0      收藏:0      [点我收藏+]

标签:div   用法   sig   内存泄漏   ptr   指针类型   决定   class   sharp   

 最近在复习c语言的时候再次用到了malloc函数和free函数,此处着讲解一下自己对这两个函数的理解和认识。

一. malloc函数和free函数的基本概念和基本的用法

对于malloc函数:

1. 包含的头文件:<mallloc.h> 或者<stdlib.h>

2. 函数的原型:void *malloc(unsigned int NumBytes);

3. 函数功能: 该函数分配了NumBytes个字节的内存空间,如果成功,则返回指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)(分配失败的原因往往有多种,例如内存空间不足)。

对于free函数:

1.包含的头文件:同malloc函数

2.函数原型 void free(void *ptr);

该函数无返回值。

3.函数功能:该函数通常与malloc在一起使用,用于释放malloc函数分配的内存空间。

函数用法示例:

#include<stdlib.h>
#include <stdio.h>
int main()
{
    int *p;
    int i = 2;
    p = (int*)malloc(sizeof(int));
    if(p)
    {
        printf("p的地址为%x!",p);

    }

    else
    {
        printf("分配失败!");

    }
    free(p);

}

  

二.更具体的解释  

   对于malloc函数,其返回值的类型是void*,而void*在c语言中仅仅是用于存储地址,若对其进行赋值运算必须进行强制类型转换(void*可以转化成任意的指针类型)。一般使用完malloc函数后需要对其返回值进行检测,检测是否为空指针。分配成功后变量就获得相应的内存空间,至于内存空间是否是连续的是由操作系统所决定的;编译器只是向操作系统申请内存空间,具体如何分内存空间还是由操作系统来决定。

 而对于free函数,它释放了由malloc函数所分配的内存空间。那么,如何理解此处的"释放"呢?实际上malloc函数就是给指针一个合法的地址,并且该地址指向一个合法的内存空间。而对指针进行free后,之前分配的内存空间就"自由了",即该内存空间又可以重新被操作系统所分配(既可能分配给本程序,也可能分配给其他程序);而free后的指针仍然存在,其值还是刚刚分配的内存空间的地址,并不是0(并不是NULL)。所以free之后,通常要手动的将指针设置为NULL。此处可见下面的一个例子:

#include<stdlib.h>
#include <stdio.h>
int main()
{
    int *p;
    int i = 2;
    p = (int*)malloc(sizeof(int));
    if(p)
    {
        printf("p的地址为%x!",p);
        free(p);
        printf("free后p的地址为%x!",p);

    }

}

  运行后,会发现两次输出的p的地址是相同的。至于free后的p所指向的值,既可能改变了,也可能没改变,因为它已经不受本程序控制,而由操作系统来决定;如果操作系统将其分给某个程序,且该程序给变了其值,那么它的值就变了。总结一下free函数,可简述为以下几点:

1.free只是释放了malloc所申请的内存,并不改变指针的值;


2.由于指针所指向的内存已经被释放,所以其它代码有机会改写其中的内容,相当于该指针从此指向了自己无法控制的地方,也称为野指针;


3.为了避免失误,最好在free之后,将指针指向NULL。

 

4.malloc后必须free,否则会造成内存泄漏。

最后,对于由malloc函数分配空间的变量,它们往往存储在堆里,而不是栈中,这点要注意。malloc申请的内存空间,也是从堆中申请,这样申请后的指针,就指向了堆中的某块内存。

 

c语言中free函数的理解

标签:div   用法   sig   内存泄漏   ptr   指针类型   决定   class   sharp   

原文地址:http://www.cnblogs.com/wangkundentisy/p/6002448.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!