行业资讯
您现在所在的位置:首页>企业动态>行业资讯

深入理解C语言malloc函数族

编辑:学到牛牛IT培训    发布日期: 2023-06-21 09:07:41  

malloc函数族由malloc free realloc calloc组成,主要功能是分配与释放内存,需要使用到的头文件 #include <stdlib.h>,以下依次介绍各个函数功能与使用方法


5.jpg


l malloc()函数


malloc的全称是memory allocation,中文叫动态内存分配,用于申请一块连续的指定大小的内存块区域。


函数原型:void* malloc(size_t size)


返回值:内存申请成功返回分配区域的起始地址,内存申请失败则返回NULL。


参数:申请内存的大小。


申请了动态内存后一定要对这段内存进行释放,使用free()函数,如果不释放的话会造成内存泄露。


原型:void free(void *ptr);


参数:ptr指向一块需要释放的内存,该内存块之前是通过调用malloc、calloc、realloc进行内存分配的。如果传递的参数是一个空指针,则不会执行任何操作。


例:申请一个动态的一维数组并释放内存


#include <stdio.h>


#include <stdlib.h>


int main()


{


    int *p = (int*)malloc(sizeof(int)*4);//申请4个单元的内存,每个单元为一个int类型的大小,共计16个字节的内存


    int i = 0;


    for(i = 0; i < 4; i++)


    {


        p[i] = i;//对申请的内存赋值


        printf("%d ",p[i]);


}


free(p);//释放内存 防止内存泄露


p = NULL;// 将指针置空 预防野指针


    return 0;


}


上面例子中malloc申请成功的内存返回后由栈上的指针p指向,加(int*)的目的是让计算机知道如何划分这个开辟的空间,因为char,int,short这些类型的字节大小是不一样的,sizeof(int)是为了知道是几个字节为单元。


l calloc()函数


原型:


void * calloc(size_t nmemb,size_t size);


calloc函数为nmemb个元素的数组分配内存空间,其中,每个元素的长度都是size个字节。在分配了内存之后,calloc()函数会通过将所有位设置为0的方式进行初始化。


calloc()函数用法如下 :


#include <stdio.h>


#include <stdlib.h>


#include <string.h>


int main()


{


    char *p = NULL;


    p = (char*)calloc(10,sizeof(char));//分配内存空间


    strcpy(p,"hello");//将hello写入


    printf("%p ",p);


    printf("%s ",p);


    free(p);


    p = NULL;


    return 0;


}


l realloc()函数  


原型:


void *realloc(void *ptr, size_t size);


功能:先判断当前的指针是否有足够的连续空间,如果有,扩大ptr指向的地址,并且将ptr返回,如果空间不够,先按照size指定的大小分配空间,将原有的数据从头到尾拷贝到新分配的内存区域,而后释放原来的ptr所指向的内存区域(注意:原来内存是函数自动释放,不需要用户使用free),同时返回新分配的内存区域的首地址。说了这么多,实际上,realloc()函数的作用就是尝试重新调整之前调用malloc或者calloc所分配的ptr所指向的内存。


用法如下:


#include <stdio.h>


#include <stdlib.h>


#include <string.h>


int main()


{


    char *ptr = NULL;


    ptr = (char*)calloc(10,sizeof(char));//分配内存空间


    strcpy(ptr,"abcdefgh");//将abcdefgh写入


    printf("%s ",ptr);//输出结果为:abcdefgh


    char *p = (char *)realloc(ptr,20);// 将ptr指向的内存扩大到20个字节的大小


    strcpy(p,"123");//将123写入p指向的内存


    int i = 0;


    for(i = 0;i < 20;i++)


    {


        printf("%c ",p[i]);


    }//输出结果为:1 2 3  e f g h


    printf(" ");


    return 0;


}


//从以上的输出结果可以看出原本ptr所指向内存中的数据已经被完整的拷贝到p所指向的内存中


免费试学
课程好不好,不如实地听一听

封闭学习

2

1

联系我们

电话:028-61775817

邮箱:1572396657@qq.com

地址:成都市金牛区西城国际A座8楼

  • 新闻频道_关注IT技术应用资讯-学到牛牛
    新闻频道_关注IT技术应用资讯-学到牛牛

    扫一扫,免费咨询

  • 新闻频道_关注IT技术应用资讯-学到牛牛
    新闻频道_关注IT技术应用资讯-学到牛牛

    微信公众号

  • 新闻频道_关注IT技术应用资讯-学到牛牛
新闻频道_关注IT技术应用资讯-学到牛牛

学一流技术,找高薪工作

新闻频道_关注IT技术应用资讯-学到牛牛

7-24小时服务热线:

028-61775817

版权声明 网站地图

蜀ICP备2021001672号

课程问题轻松问