👑个人主页:啊Q闻
🎇收录专栏:《C语言》
🎉道阻且长,行则将至
前言
我们之前学过了内存开辟方式:
int i=2;//在栈空间上开辟4个字节 char arr[10]={0};//在栈空间上开辟10个字节
但是这种开辟空间其有两个特点:
1.空间开辟大小是固定的。
2.数组在声明的时候,必须指定数组长度,而且数组空间大小一旦确定就不可以调整。
可是有时候我们需要的空间是在程序运行过程中才知道的,所以我们需要更灵活的空间开辟方式。
C语言中引入动态内存开辟,让程序员自己可以申请和释放空间。
一.malloc
malloc是一个动态内存开辟函数,其头文件为<stdlib.h>
1.这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。
如果开辟成功,则返回一个指向开辟好空间的指针。
如果开辟失败,则返回一个NULL指针,所以我们使用malloc时,要对其返回值进行检查。
2.我们利用void*接受返回值,所以malloc并不知道开辟空间的类型,具体在使用的时候由使用者自己决定,然后使用是,要进行强制性转化。
malloc的应用:
2.free
C语言提供一个函数free,专门用来做动态内存的释放和回收的。其头文件是<stdlib.h>。
1.其指针是指向空间的起始地址 。
2.如果参数ptr指向的空间不是动态开辟的,那free函数的行为是未定义的。
2.如果参数ptr是NULL指针,则函数什么事都不做。
free的应用:
三.calloc
C语言还提供函数calloc用于动态内存开辟。
1.calloc函数作用是为num个大小为size的元素开辟一块空间,并且把空间的每个字节初始化为0。
注:malloc与calloc的区别只在于calloc会在返回地址之前把申请的空间的每个字节初始化全为0。
calloc的应用:
四.realloc
1.realloc函数的出现让动态内存的管理更加灵活。
2.有时我们发现过去申请的空间太大或太小了,那这个时候我们要调整内存大小, 所以我们引入realloc函数达到对动态开辟内存大小的调整.
3.ptr是要调整的内存地址。
4.size为调整之后的大小
5.返回值为调整之后的内存起始位置。
调整原内存空间,会有两种情况:
一.调整失败,返回NULL.
二.调整成功,有两种情况:
情况1:原有空间之后有足够大空间。
情况2:原有空间之后没有足够大的空间。
对于情况1,要扩展内存就直接在原有的内存空间之后追加空间,原来空间的数据不发生变化。
对于情况2,原来空间之后没有足够空间时,我们的方法是:在堆空间上另外找一个合适大小的连续空间来使用,把旧的数据拷贝到新的空间,然后释放旧空间,返回新的空间的地址。
情况2:
谢谢大家阅读,如果对你有帮助,三连支持一下叭