malloc
函数原型:
void* malloc(size_t size)
- 如果开辟成功,则返回一个指向开辟好空间的指针。
- 如果开辟失败,则返回一个NULL指针。
- 返回值的类型是void*,所以malloc函数并不知道开辟空间的类型,具体在使用时由使用者决定。
- 如果参数size为0,malloc函数的行为是标准未定义的,由编译器决定。
因此,在使用malloc函数时,对返回值一点要做检查。
既然申请了内存,就需要释放内存。
函数原型:
void* free(void* ptr)
- 如果参数ptr是NULL指针,则该函数什么都不做。
- 如果参数ptr指向的空间不是动态开辟的,那么free函数的行为是未定义的。
使用时的注意事项:
- 申请一次,释放一次。整体申请,整体释放。
- 已经free过的空间无法再被free掉,指针仍指向这段内存区域。
- free之后的内存区域不能在被使用。该指针需要置为空指针,否则会变为野指针(悬垂指针)。
- free之后的内存实际比malloc申请的多一部分,原因:需要有多一部分来管理该段内存。
int *ptr=NULL;
ptr=(int*)malloc(num*sizeof(int));
if(NULL!=ptr)
{
//
}
free(ptr);
ptr=NULL;
calloc
函数原型:void* calloc(size_t num,size_t size);
- 函数的功能是为num个大小为size的元素开辟一块空间,并且把空间的每个字节初始化为0;
- 与malloc的区别:calloc会在返回地址之前把申请的空间的每个字节初始化为0;
- 根据实际情况,malloc比calloc快。
int *p=calloc(10,sizeof(int));
if(NULL!=p)
{
//
}
free(p);
p==NULL;
return 0;
realloc
函数原型:void* realloc(void* ptr,size_t size);
- realloc函数可以对动态开辟内存大小进行调整。
- ptr是要调整的内存地址。
- size为调整之后的大小
- 返回值为调整之后的内存空间的起始地址
- 这个函数除了会调整内存空间的大小之外,还会将原来的数据移动到新的内存空间。
此时:就会出现两种情况
1.原有空间之后有足够大的空间。
2.原有空间之后没有足够大的空间。 - 情况1时:直接在原有内存之后追加空间,原来的空间数据不发生变化。
- 情况2时:在堆空间上另找一个合适大小的连续空间来使用,函数返回一个新的内存地址。
int *ptr=malloc(100);
if(ptr!=NULL)
{
//
}
else
{
exit(EXIT_FAILURE);
}
//扩展容量
int *ptr=NULL;
p=realloc(ptr,1000);
if(p!=NULL)
{
ptr=p;
}
//
free(ptr);
return 0;