前言:
我们都知道,内存分为几个区——栈区、堆区、静态区、常量区、代码区,我们在写代码的时候经常会遇到栈溢出这个问题,是因为在程序运行之前,我们无法准确的知道要分配多少空间给程序,所以说很容易造成栈溢出或者导致内存被白白的浪费——但是,动态内存管理,就可以帮助我们解决这个问题——它可以在堆区开辟出一些区域来分配给程序,所以说能够在一定程度上避免栈溢出的问题(strack overflow)还可以根据用户的需求更加灵活的分配宝贵的内存。
malloc函数:
我用我的方式理解,这是一个最基本的动态内存分配函数,它直接在堆区开辟一块内存,然后返回空指针给程序,我们需要用一个有类型的指针对其接收,下面来举个例子:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>//用strerror函数的头文件
#include<errno.h>//用erron函数的头文件
#include<string.h>//用于报错的头文件
int main()
{
int* p = (int*)malloc(40);//malloc函数申请40字节的空间,用p来接受
if (p == NULL)//判断,如果没有申请成功,则p为空指针
{
printf("p:%s", strerror(errno));//将错误信息打印
return 1;//如果错了就不执行了,直接终止代码,并且返回1
}
int i = 0;//如果申请成功
for (i = 0; i < 10; i++)//则给p初始化
{
*(p + i) = i + 1;
}
for (i = 0; i < 10; i++)//将p打印出来看看
{
printf("%d ", *(p + i));
}
return 0;
}
我们发现,这样是成功的,malloc函数就是像这样使用的,值得注意的是,malloc函数返回的是空指针,我们先要用强制类型转换将其转为你需要的指针类型再使用,并且应该要养成一个好习惯,那就是先进行判断,是否申请成功,如果没有申请成功,应该打印错误信息并且终止程序,以免导致内存泄漏或者本来的空间出现问题。
free函数:
内存是十分宝贵的,我们申请了内存,应该要及时的释放它,不然就会造成浪费,有可能你会觉得你的内存很大,才申请几十个字节,完全不影响,但其实不然;一方面是节约资源,另一方面,如果不释放的话,有可能会对于你后面的程序有影响,导致一些你很难发现的错误(bug)。所以说为了及时释放内存,我们要用free函数,它用法十分简单:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>//用strerror函数的头文件
#include<errno.h>//用erron函数的头文件
#include<string.h>//用于报错的头文件
int main()
{
int* p = (int*)malloc(40);//malloc函数申请40字节的空间,用p来接受
if (p == NULL)//判断,如果没有申请成功,则p为空指针
{
printf("p:%s", strerror(errno));//将错误信息打印
return 1;//如果错了就不执行了,直接终止代码,并且返回1
}
int i = 0;//如果申请成功
for (i = 0; i < 10; i++)//则给p初始化
{
*(p + i) = i + 1;
}
for (i = 0; i < 10; i++)//将p打印出来看看
{
printf("%d ", *(p + i));
}
free(p);
p=NULL;
return 0;
}
我们只需要在上面的代码后面加上free(你用来接收空间的变量名),就可以将申请的空间释放了,但是值得注意的是:虽然你释放了,但是p的地址还是原来的申请的空间的地址,如果你后面再对p有什么操作,极大可能将会影响到存入原来地址的新数据,所以说我们要让p等于一个空指针,这样它的地址才不会不变,也就不会对程序产生影响了。
后面还有几个函数,下回分解。