大家好,我是残念,希望在你看完之后,能对你有所帮助,有什么不足请指正!共同学习交流
本文由:残念ing原创优快云首发,如需要转载请通知
个人主页:残念ing-优快云博客,欢迎各位→点赞👍 + 收藏⭐️ + 留言📝
📣系列专栏:残念ing 的C语言系列专栏——优快云博客
-----------------------------------------------------------CSDN-------------------------------------------------------------
目录
前言:
为什么要有动态内存管理???
我们平时在开辟空间时是这样的:
int a=10;//在栈空间上开辟4个字节
char arr[10]={0};//在栈空间上开辟10个字节的连续空间
这样开辟的空间有两个弊端:
1、空间开辟是固定不变的
2、数组在申明的时候,必须指定数组的长度,数组空间一旦确定了大小不能调整
我们会遇到很多情况,有时候我们需要的空间大小在程序运行的时候才知道,这时开劈好的空间会不能满足,或者开辟多了,会导致大量的空间浪费。
这就有了动态内存开辟,让程序员可以自己申请需要的空间和释放不需要的空间,这就比较灵活了。
1. malloc 和free( <stdlib.h> )
1.1 malloc
这是一个动态内存开辟的函数:
void* malloc(size_t size);
作用:可以向内存申请一块连续可用的空间,并返回指向这块空间的指针。
注意:如果开辟成功,则返回一个指针开辟好空间的指针。
如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做判断。
返回值的指针类型是void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。
如果参数size 为0,malloc的行为标准是未定义的,取决于编译器。
补充:malloc 申请的空间是在内存的堆区的
malloc的使用:
1.2 free
C语言还为我们提供了一个专门用来做动态内存的释放和回收的函数 free :
void free (void* ptr);
作用:用来释放动态开辟的内存。
注意:1、如果参数 ptr 指向的空间不是动态开辟的,那么 free 函数的行为是未定义的。
2、如果参数 ptr 是NULL指针,则函数什么都不做。
补充:free 只是会把 ptr 指向的空间释放了,但是 ptr 里面还存着那块空间的起始地址,我们为了防止 ptr 后面会成为野指针,我们必须要把 ptr 制为空指针。
free 的使用:
2. calloc 和 realloc
2.1 calloc
除了malloc外 还有一个 calloc 函数,它也是用来动态内存开辟的:
void* calloc(size