函数原型:void*malloc(size_t size);
malloc函数,即memory allocation,中文叫动态内存分配。其作用是在内存的动态存储区中分配一个长度为size的连续空间。
如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
当内存不再使用时,应使用free()函数将内存块释放。
free()函数原型:void free(void *ptr);
free函数用来释放动态开辟的内存。 如果参数 ptr 指向的空间不是动态开辟的,那free函数的行为是未定义的。 如果参数 ptr 是NULL指针,则函数什么事都不做。
举例:
void main()
{
int n = 10;
int *pa = (int *)malloc(sizeof(int)*n);//开辟一个动态整形空间
if (pa == NULL)
{
printf("Out Of Memory\n");
return;
}
free(pa);
}
开辟一个10个整形的动态内存空间,指针pa指向这个空间,判断是否分配成功,若不成功,打印"Out Of Memory",最后free(pa)释放内存块。
函数原型:void* calloc (size_t num, size_t size);
函数的功能是为 num 个大小为 size 的元素开辟一块空间,并且把空间的每个字节初始化为0。
与函数 malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全0。
举例:
void main()
{
int n = 10;
int *pb = (int *)calloc(n, sizeof(int));//可以初始化
if (pb==NULL)
{
printf("Out Of Memory\n");
return;
}
free(pb);
}
如图所示,初始化为0:
函数原型:void* realloc (void* ptr, size_t size);
ptr 是要调整的内存地址, size 调整之后新大小 ,返回值为调整之后的内存起始位置。
作用:对动态开辟内存大小进行调整。
情况1:原有空间之后有足够大的空间 ,要扩展内存就直接原有内存之后直接追加空间,原来空间的数据不发生变化。
情况2 :原有空间之后没有足够多的空间时,扩展的方法是:在堆空间上另找一个合适大小的连续空间来 使用。这样函数返回的是一个新的内存地址。
举例:
void main()
{
int n = 5;
int *pa = (int *)malloc(sizeof(int)*n);//开辟一个动态整形空间
if (pa == NULL)
{
printf("Out Of Memory\n");
return;
}
int *tep=(int*)realloc(pa, sizeof(int)* 10);//改变申请空间的大小
if (tep == NULL)//用临时指针接收
{
printf("Out Of Memory\n");
free(pa);
return;
}
else
{
pa = tep;
}
free(pa);
pa = NULL;
}