一、malloc函数
1、函数介绍
头文件:#include <stdlib.h>
void *malloc( size_t size );
如果开辟成功,则返回一个指向开辟好空间的指针。
如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。
返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。
如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器。
2、函数怎么调用
(1)申请多大自己计算;
(2)需要强转类型;
例如:int *ar=(int *)malloc (sizeof(int) *n);
(3)可能申请不成功;
需要加上:
if(NULL == p)
{
printf("Out Of Memory.\n");
return;
}
(4)必须释放空间;
例如:
free(p);//释放空间
p=NULL;//释放指针
二、free函数
1、函数介绍
C语言提供了另外一个函数free,专门是用来做动态内存的释放和回收的,函数原型如下:
void free (void* ptr);
free函数用来释放动态开辟的内存。
2、函数要点
1)如果参数 ptr 指向的空间不是动态开辟的,那free函数的行为是未定义的。
2)如果参数 ptr 是NULL指针,则函数什么事都不做。
3)释放指针和释放空间并不相同,其中释放空间只是把空间使用权进行归还,并没有释放指针。
4)一定要进行释放空间,否则会出现空间泄露的问题。
三、calloc函数
1、函数介绍
C语言还提供了一个函数叫 calloc,calloc 函数也用来动态内存分配。原型如下:
void* calloc (size_t num, size_t size);
(1)函数的功能是为 num 个大小为 size 的元素开辟一块空间,并且把空间的每个字节初始化为0。
(2)与函数 malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全0。
2、函数怎么调用
函数调用与malloc相似,例如:
int *ar=(int *)calloc (0,sizeof(int));
其中,calloc 会在返回地址之前把申请的空间的每个字节初始化为全0。
四、realloc函数
realloc函数的出现让动态内存管理更加灵活。
有时会我们发现过去申请的空间太小了,有时候我们又会觉得申请的空间过大了,那为了合理的时候内存,我们一定会对内存的大小做灵活的调整。那realloc函数就可以做到对动态开辟内存大小的调整。函数原型如下∶
void* realloc (size_t num, size_t size);
2、函数怎么调用
realloc在调整内存空间的是存在两种情况:
情况1:原有空间之后有足够大的空间
情况2:原有空间之后没有足够大的空间
情况1
当是情况1的时候,要扩展内存就直接原有内存之后直接追加空间,原来空间的数据不发生变化。
情况2 当
是情况2的时候,原有空间之后没有足够多的空间时,扩展的方法是:在堆空间上另找一个合适大小的连续空间来
使用。这样函数返回的是一个新的内存地址。
例如:
#include<stdio.h>
void main()
{
int n = 10;
int *p = (int *)realloc(NULL, sizeof(int) *n); //malloc
if(NULL == p)
return;
for(int i=0; i<n; ++i)
{
p[i] = i + 1; //1 2 3 4 5 x x x x x
}
for(int i=0; i<n; ++i)
{
printf("%d ",p[i]); //1 2 3 4 5
}
printf("\n");
n = 5;
p = (int *)realloc(p, sizeof(int) * n);
for(int i=0; i<n; ++i)
{
printf("%d ",p[i]); //1 2 3 4 5
}
printf("\n");
free(p);
}
五、realloc函数
常见的动态内存错误:
1、对NULL指针的解引用操作;
2、对动态开辟空间的越界访问;
3、对非动态开辟内存使用free释放;
4、对同一块动态内存多次释放;
5、动态开辟内存忘记释放(内存泄漏)。