重点动态分配函数,后面的数据结构之单链表实现顺序表等内容需要大量用到这类内容,因此一定要重点掌握,因为在学校这段时间需要向后赶一些专业课,因此每篇的内容会比较少,但都会长期连更,因此希望大家多多关注点赞哦!
1.calloc函数
类比malloc函数也是用来开辟动态内存的
1.1函数形式:
void* calloc(size_t num, size_t size);
1.2两函数对比:
形式上就是多了一个size_t num
1.3calloc函数的使用
1.函数的功能:为num个大小为size的元素开辟空间,并且把空间每个字节初始化为0;
2.与函数 malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全 0。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int* p = (int*)calloc(10, sizeof(int));
if (NULL != p)
{
int i = 0;
for (i - 0; i < 10; i++)
{
printf("%d", *(p + i));//循环打印出来每个元素
}
}
free(p);//释放;
p = NULL;
return 0;
}
运行结果:
因此,如果需要对申请的空间的内容进行初始化,那么可以直接使用calloc函数完成,首先开辟了空间,其次完成了初始化
2.realloc函数
2.1函数形式
void* realloc(void* ptr, size_size);
2.3函数作用(和使用)
1.让动态内存管理变得更加灵活
2.可以直接调整开辟后的内存大小
注意:
1.ptr是要调整的内存地址,传过去的是一个指针
2.size是调整后的大小
3.返回值是调整后的内存起始位置,也就是返回了一个地址(指针)
4.调整内存大小的过程中,会将原来内存中的数据移动到新的空间
2.4调整空间的两种情况
2.4.1原有空间之后有足够大的情况
2.4.2原有空间没有足够大的情况
像这种第二种情况就需要在堆空间上重新开辟一块空间来使用,这样的话函数返回的是一个新的内存的地址(指针)
2.5使用realloc函数的注意事项
//代码1 - 直接将realloc的返回值放到ptr中
ptr = (int*)realloc(ptr, 1000);//这样可以吗?(如果申请失败会导致报错无法正常申请)
//推荐代码2 - 先将realloc函数的返回值放在p中,不为NULL,在放ptr中
int* p = NULL;
p = realloc(ptr, 1000);
if (p != NULL)
{
ptr = p;
}
//业务处理
free(ptr);
return 0;
}
完—
加上昨天讲解的2个一共是4个函数后续会经常用到,大家可以先进行收藏。等到这几节全部讲完也会出一个全篇的方便大家查看。
有什么问题可以直接评论或者私信我哦