动态内存管理
存在的意义
我们的内存开辟方式主要是:
int a=0;//开辟4字节的空间
int arr[5]={
0};//开辟20字节的空间
这样开辟存在着几个问题:
由于变量开辟是在内存中的栈中,空间比较有限。
只能开辟固定的内存空间,不方便后续调整。
在特定的场景下我们并不能获取需要开辟的内存大小。
所以我们有动态开辟空间来解决一些特定情景下的问题。
1.不能确定需要的内存大小,或者是一个变化的内存大小
2.可以开辟较大的空间来操作(动态开辟的内存空间在内存堆上,空间大于变量所在的栈空间)
3.不过虽然很好,但是动态开辟的内存空间需要我们申请的人主动释放,否则会造成严重的内存泄漏。
内存泄漏可以说是一个很致命的问题,尤其是在一些连续运行的地方,如服务器代码。严重的会导致服务器瘫痪。
- 栈区(stack):在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些
存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有
限。 栈区主要存放运行函数而分配的局部变量、函数参数、返回数据、返回地址等。- 堆区(heap):一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。分配方式类似
于链表。
相关函数
1.malloc
C语言提供了一个动态内存开辟的函数:
void* malloc(size_t size);
//size是指开辟空间的字节数
这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。
1.开辟成功,则返回一个指向所开辟空间的指针。失败返回NULL;
2.返回值泛型,所以我们可以自己决定。
3.如果参数 size 为0,malloc的行为是标准是未定义的.
我们一般使用malloc的这样用:
int* arr=(int*)malloc(4);
int a[5]={
0};
char* arr1=(char*)malloc