C语言malloc函数族
malloc函数族由malloc free realloc calloc组成,主要功能是分配与释放内存,需要使用到的头文件 #include <stdlib.h>,以下依次介绍各个函数功能与使用方法
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)是为了知道是几个字节为单元。
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;
}
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所指向的内存中