目录
上期内容
C语言动态内存开辟函数介绍之malloc、free_长白听书人的博客-CSDN博客
calloc函数介绍
calloc函数用于从存堆上申请一块指定大小的空间并把该空间的内容全部初始化为0,在以函数返回的形式返回指向该空间起始地址的指针
函数申明:
void* calloc (size_t num, size_t size);
实现功能:
向堆区申请一块连续的空间并将空间的内容全部初始化为0,最后返回指向该空间起始地址的指针
参数:
- 参数1:要申请的元素个数
- 参数2:每个元素的大小
返回指:
- 果申请空间成功,会返回一个指向该空间起始地址的指针
- 如果申请空间失败,会返回NULL(空指针)
使用:
#include <stdio.h>
#include <stdlib.h>
int main()
{
//向堆区申请10个元素,每个元素占4个字节大小并将该空间的内如初始化为0
int* pa = (int*)calloc(10,sizeof(int));
//使用
if (pa != NULL)
{
int i = 0;
for (i = 0; i < 10; i++)
{
*(pa + i) = i + 1;
}
}
//释放
free(pa);
pa = NULL;
return 0;
}
使用细节
- 如果num参数如果小于1或size参数小于1,calloc的行为是标准未定义的,取决于编译器
- calloc返回的是void类型的指针,所以接收返回值时需要进行强制类型转换
- 因为需要将calloc空间里的内容初始化所以malloc的效率要高于calloc
- calloc有可能会开辟空间失败,所以一般使用的时候会检查calloc的返回值是否为空指针
realloc函数介绍
对一块已申请且动态开辟空间经行扩缩容
函数申明:
void* realloc (void* ptr, size_t size);
实现功能:
对一块动态开辟的空间进行调整,并返回一个指向调整后的空间起始地址指针
参数:
- 参数1:要调整空间的内存地址,如果参数为空指针则实现的功能与malloc一样
- 参数2:该空间的新大小(单位是字节),,如果参数为0则会对该空间经行释放并返回一个空指针
返回值:
- 空间调整失败或size参数为0,会返回空指针
- 调整空间成功,会返回一个指向调整后的空间起始地址指针
使用:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int* ptr = (int*)calloc(10,sizeof(int));
//对ptr所指向空间调整成sizeof(int)*20个字节
int* tmp = (int*)realloc(ptr,sizeof(int)*20);//要调整空间的地址,调整成多少个字节
//realloc的返回值如果为空指针会将原本ptr指向的空间覆盖,所以需要一个中间值
if (tmp != NULL)
{
ptr = tmp;
}
//对ptr所指向空间调整成sizeof(int)*5个字节
int* tmp = (int*)realloc(ptr, sizeof(int) * 5);
if (tmp != NULL)
{
ptr = tmp;
}
//释放
free(ptr);
free(tmp);
ptr = tmp = NULL;
return 0;
}
使用细节
- 如果参数size小于0,relloc的标准是未定义的,取决于编译器
- realloc如果返回空指针会将原本的空间置为空,所以需要一个中间来过度realloc的返回值
- 如果源空间后有足够的空间,会在原地址后为其追加的的空间
- 如果原地址处没有足够空间,会在堆上另找一块足够大的空间将原数据拷贝到新空间中,并释放掉源空间