动态内存管理小记

  • 为什么存在动态内存分配

当前我们已知的在内存中开辟空间的方法有

int val=20;//在栈空间上开辟四个字节的空间
char arr[10]={0};//在栈空间上开辟十个字节的连续空间

他们在开辟的时候就被固定了大小,无法改变,而有些时候,我们需要扩大容量,例如数组,我们开始定义的大小满足不了后来的需求,而为了满足需求,我们需要扩大容量,但上述方法无法改变容量。

他们开辟空间大小是固定的,无法改变。这时候只能创建另一个变量,并使其有更大的容量,再将原来的数据拷贝进新变量,但很麻烦,占用了空间。这时候,我们可以尝试动态内存开辟。

动态内存开辟

静态内存开辟一般是直接开辟,不需要辅助函数

而动态内存的开辟,需要使用动态内存函数。

首先介绍malloc函数

基本语法格式:void*malloc(size_t size);

由此可知malloc函数返回的是一个void*类型的指针,即这个函数向内存申请了一块连续可用的大小为size字节的空间,并返回这个空间的起始地址。

  • 如果开辟成功,则返回一个指向开辟空间的指针。
  • 如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。
  • 返回值的类型是void*,所以代表malloc函数并不知道开辟空间的类型,具体在使用的时候需要使用者自己来决定。——如 int*pa=(int*)malloc(40);
  • 如果参数size为0,malloc的行为是标准未定义的,由编译器自定。fr
#include<stdlib.h>//包含malloc函数的头文件
int main()
{
   int*a=(int*)malloc(40);//向堆区申请一个大小为四十个字节的空间,并将起始地址返回。
    if(a==NULL)
   {
       return ;//如果malloc函数开辟空间失败,返回控制针,则直接退出程序。
   }
   int i=0;
   for(i=0;i<10;i++)
   {
       *(a+i)=i;
       printf(" %d ",*(a+i));
   }
   return 0;
}
   

上述代码是malloc函数使用的基本流程,在函数malloc开辟空间后,需要对其返回的指针进行判断是否为空指针,如果是控制针则停止程序不是则继续。函数malloc开辟空间后,在使用完后,其开辟的空间也一直存在,占用着内存,这其实是有点浪费空间的,所以,我们要在使用后,释放空间。

而释放动态内存的空间也有函数,即free函数

free函数

free函数是用来释放动态开辟的内存,防止其占用空间,浪费资源

语法:void free(void*pa);

  • 如果参数pa指向的空间不是动态开辟的,那free函数的行为是未定义的。
  • 如果参数pa是一个NULL指针,则函数什么都不做,即什么都不会改变。

free函数也存在于stdlib.h头文件中。

calloc函数

它的功能和malloc函数一样,也是在堆区开辟空间。

语法:void*calloc(size_t num,size_t size);

  • 函数的功能是为num个大小为size的元素开辟一块空间,并且把空间的每个字节初始化为零。
  • 与函数malloc的区别在于calloc函数会在返回地址之前把申请的空间的每一个字节初始化为0。

calloc函数与malloc的函数使用方法基本一样,都需要判断返回的指针是否为空,在使用完空间后都需要释放空间,否则会造成内存泄露,另外,calloc函数还会把每一个字节初始化为零,而malloc函数中每一个字节都是随机值,具体情况具体分析,选择使用哪个函数。

当我们需要对申请的内存空间进行初始化的时候,用calloc函数就可以很轻易的完成任务。

realloc函数

它与之前的malloc函数和calloc函数不同,它的主要作用不是向堆区申请空间,而是在申请空间的原有基础上去扩大空间。

语法:void*reallocal(void*ptr,size_t size)

  • ptr是要调整的内存地址
  • size是调整之后的新大小
  • 返回值为调整之后的内存其实位置。
  • 这个函数调整内存空间大小的基础上,还会将原来内存中的数据移动到新的空间。
  • realloc在调整内存空间时存在两种情况
  1. 情况1:原有空间之后有足够大的空间
  2. 情况2:原有空间之后没有足够大的空间

当是情况1的时候

 要扩展内存就直接原有空间内存之后直接追加空间,直接扩容,并且原来空间的数据不会发生变化,返回的是原来空间的起始地址

当是情况2的时候

 原有空间后没有足够的空间申请,这时候,函数realloc回去寻找一个新的空间,在推空间上寻找一个合适的连续空间来使用,这样函数返回的是一个新的起始地址。

使用例子

#include<stdio.h>
#include<stdilb.h>
int main()
{
   int*pa=(int*)malloc(40);
   if(pa==NULL)
   {
      return ;
   }
   int *pb=(int*)realloc(pa,80);
   if(pb==NULL)
    {
         return ;
    }
   pa=pb;
   free(pa);
    pa=NULL;
    return 0;}

注意使用realloc函数对原有空间进行扩充时,你不知道返回的指针是否是空指针,如果你用原来的指针去接收realloc函数的返回值,会导致原来的指针找不到原来的空间,从而产生错误,并且导致原来的内存空间泄露,因此,需要重新创建一个指针变量来接收realloc函数的返回值,并判断这个指针变量之后是不是空指针,如果不是,再将这个指针变量存储的地址赋值给原指针。

以上,就是有关动态内存函数的相关介绍,谢谢观看。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值