前言
在上次的博客中我更新了通讯录动态内存升级版,涉及了部分动态内存的相关知识,没有学过的小伙伴可以看这里哦!
在介绍动态内存之前呢,我们需要了解一些内存的知识,通过一张图来简单了解一下吧
相比大家对动态内存的概念很模糊,其实动态内存顾名思义,内存是可变的
malloc函数
需要引用头文件#include<stdlib.h>,受用malloc函数开辟的空间是动态的,代码演示,向内存申请了10个int类型的空间也就是40个字节,将申请的空间放在指针p中,因为malloc是void类型的所以要强制类型转换,int p = (int*)malloc(10 * sizeof(int)),这是一个标准写法,开辟多大就要n * sizeof(类型),每当我们动态申请完空间都要判断是否申请成功,因为动态内存不是百分百保证成功的,使用if判断避免把p变成野指针而引起错误,如果申请成功,我们就写一个输出代码打印0-9的数字,重点!!!当时用完动态内存之后,我必须使用free函数来释放申请的动态内存还给操作系统,如果不释放内存,久而久之内存就会堵塞free(p);p==NULL;将p赋值为空指针,防止p再与此空间产生联系变成野指针而干扰别的代码的运行
#include<stdlib.h>
#include<errno.h>
int main()
{
int* p = (int*)malloc(10 * sizeof(int));//向内存申请了10个整型的空间,(int*)是强制类型转换,因为malloc是(void*)类型
if (p==NULL)//申请失败,返回空指针
{
printf("%s\n",strerror(errno));//打印错误码
}
else//申请成功,正常使用空间
{
int i = 0;
for (i = 0; i < 10; i++)
{
*(p + i) = i;
}
for (i = 0; i < 10; i++)
{
printf("%d ", *(p + i));
}
}
//当动态申请的空间不再使用的时候
//就应该还给操作系统
free(p);
p = NULL;//既然已经将空间释放,就主动将p赋值成空指针,防止p再与此空间产生联系
return 0;
}
calloc函数
calloc和malloc函数用法几乎一样,小小的区别(10, sizeof(int))大家注意哦,还有一个不同之处,calloc申请的空间会将空间的元素值初始化置为0,用于适应不同程序的需求,打印出来大家可以看看,注意释放空间哦
#include<stdlib.h>
#include<errno.h>
int main()
{
int* p = (int*)calloc(10, sizeof(int));
if (p == NULL)
{
printf("%s\n",strerror(errno));
}
else
{
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ",*(p+i));
}
}
free(p);//释放空间
p = NULL;
return 0;
}
realloc函数
可能到这里大家还是一脸懵逼,想着这样哪里使空间可变了呢,ok,它来啦!他来啦!她迈着步伐走来了!他就是realloc函数,前面的malloc,calloc函数都是动态开辟,但是要使空间真正的可大可小,必须用到realloc函数,其功能就是,调整动态开辟的内存空间的大小,我们依然使用malloc动态开辟20字节的空间,然后打印0-4的数字,但是我后悔了,空间开小了,我想打印0-9的数字,可是少了20字节的空间,这样就用到了realloc函数了,int* ptr= realloc(p, 40)这是标准写法,这里的40就额外开辟了20字节的空间
#include<stdlib.h>
#include<errno.h>
int main()
{
int* p = (int*)malloc(20);//开辟20字节
if(p==NULL)
{
printf("%s\n",strerror(errno));
}
else
{
int i = 0;
for (i=0;i<5;i++)
{
*(p + i) = i;
}
}
int* ptr= realloc(p, 40);
if (ptr!=NULL)
{
p = ptr;
int i = 0;
for (i = 5; i < 10; i++)
{
*(p + i) = i;
}
for (i = 0; i < 10; i++)
{
printf("%d ", *(p + i));
}
}
free(p);//释放内存
p == NULL;
return 0;
}
这里只是使用malloc开辟的20字节空间 假设这里20个字节不能满足我们的使用了,而我们希望能够用40个字节的空间 这里就可以使用realloc来调整动态开辟的内存 realloc注意事项 1.如果p指向的空间之后有足够的内存空间,则直接追加,返回p 2.没有足够的内存空间,则realloc会重新开辟新的满足需求的内存空间,并且将原来空间中的数据拷贝回来,释旧的内存空间 最后返回新开辟的内存空间地址, 3.用一个新的变量ptr的来接受realloc函数的返回值(防止开辟的空间不够将p指向的空间弄丢)
free函数
free就是一个配合malloc,calloc,realloc函数使用的,用来释放动态开辟的空间