zoukankan      html  css  js  c++  java
  • 对c语言中malloc和free函数的理解

     最近在复习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函数分配空间的变量,它们往往存储在堆里(是*p不是p,p作为变量的地址还是存在栈里),而不是栈中,这点要注意。malloc申请的内存空间,也是从堆中申请,这样申请后的指针,就指向了堆中的某块内存。

     

  • 相关阅读:
    给Linux添加google搜索命令
    安卓设置脚本开机自启动
    重读The C programming Lanuage 笔记四:c预处理
    重读The C programming Lanuage 笔记三:简单计算器程序
    重读The C programming Lanuage 笔记二:运算符优先级
    重读The C programming Lanuage 笔记一:类型转换
    【 转】 C/C++结构体和联合体的区别
    python 柯里化 和装饰器
    qq bug 一个
    网站收集
  • 原文地址:https://www.cnblogs.com/wangkundentisy/p/6002448.html
Copyright © 2011-2022 走看看