一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情。
calloc
功能是为num个大小为 size 的元素开辟一块空间,并且把空间的每个字节初始化为0
与函数malloc的区别只是在于calloc会在返回地址之前把申请的空间的每个字节初始化为全0
如下图
void* calloc(size_t num, size_t size);
int main()
{
//malloc(10*sizeof(int));
int* p = (int*)calloc(10, sizeof(int));
if (p == NULL)
{
printf("%s\n", strerror(errno));
}
else
{
int o = 0;
for (i = 0; i < 10; i++)
{
printf("%d", *(p + i));
}
}
//释放空间
//free函数是用来释放动态内存开辟的空间的
free(p);
p = NULL;
return 0;
}
\
当我们对申请的内存空间的内容要求初始化,那么可以使用calloc函数
realloc
void* realloc(void* ptr, size_t size);
ptr 是要调整的内存地址
size 调整之后的新大小
返回值为调整之后的内存起始地址
函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到新空间
realloc在调整内存空间的是存在两种情况
情况1:原有空间之后有足够大的空间( 扩展内存就直接原有内存之后直接追加空间,原来空 间的数据不发生变化)
情况2:原有空间之后没有足够的空间——开辟新空间(在堆空间上寻找另一个合适大小的连 续空间来使用),这时函数返回一个新的内存地址
realloc函数的使用:
int main()
{
int* p = (int*)malloc(20);
if (p == NULL)
{
printf("%s\n", strerror(errno));
}
else
{
int i = 0;
for (i = 0; i < 5; i++)
{
*(p + i) = i;
}
}
//就是在使用malloc开辟的20个字节空间
//假设这里20个字节已经不满足我们使用了
//希望可以有40个字节的空间
//这里可以使用realloc来调整动态开辟的内存
int* p2 = realloc(p, 40);
int i = 0;
for (i = 5; i < 10; i++)
{
*(p2 + i) = i;
}
for (i = 0; i < 10; i++)
{
printf("%d", *(p2 + i));
}
return 0;
}
\