欢迎来到军工软件开发人才培养基地——学到牛牛

深入理解C语言malloc函数族

时间:2024-05-06 07:01:10 来源:学到牛牛

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

 

 

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\n",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\n",p);

 

    printf("%s\n",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\n",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("\n");

 

    return 0;

 

}

 

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