动态内存管理

前言

在上次的博客中我更新了通讯录动态内存升级版,涉及了部分动态内存的相关知识,没有学过的小伙伴可以看这里哦!

在介绍动态内存之前呢,我们需要了解一些内存的知识,通过一张图来简单了解一下吧

 

相比大家对动态内存的概念很模糊,其实动态内存顾名思义,内存是可变的

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函数使用的,用来释放动态开辟的空间

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值