【C语言】动态内存管理

 瞳绣的博客

每天进步一点点,希望的火苗不熄灭。


目录

一、动态内存分配存在的原因

二、动态内存开辟的方式 

1. malloc和free

2. calloc

3. realloc

三、C程序的内存开辟 


一、动态内存分配存在的原因

在之前我们学习过数组的内存开辟方式

//在内存中开辟一块能容纳10个int型数据的空间,并将它进行不完全初始化
int arr[10]={0};

图解如下:不完全初始化只将数组第一个元素a[0]初始化为0,a[1]~a[9]为默认值。假设我们在整个程序运行过程中只使用到a[0]的话,那么就会造成空间的浪费。

而另外一种情况,假设我们开辟的空间比我们将要使用的少的话,那又会造成空间的不足。

为了更好的利用内存空间我们引入了动态内存分配

二、动态内存开辟的方式 

1. mallocfree

 malloc:C语言提供的一个动态内存开辟的函数,我们使用此函数来完成动态的内存开辟。

 使用格式:void* malloc (size_t size);

使用示例:
int* pa = (int *)malloc(40);

此句代码的意思:在内存中开辟一块大小为40字节的内存空间,并将此空间的首地址返回给pa;

因为原来malloc函数返回类型为(void*)任意型,我们便可以将他强制转换为我们需要的指针类型。

注意:malloc在内存中是以字节为单位进行开辟的,我们当然也可以将上述强制转换为(char*)也就是说开辟40个大小为1字节的char类型;

总结:
1.这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。
2.如果开辟成功,则返回一个指向开辟好空间的指针。
3.如果开辟失败,则返回一个 NULL 指针,因此 malloc 的返回值一定要做检查。

4.返回值的类型是void*,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。

5.如果参数size为0malloc的行为是标准是未定义的,取决于编译器。


free:C语言提供的专门用来做动态内存的释放和回收的;

使用格式:void free (void* ptr);

使用示例:

free(pa);
pa=NULL;

此句代码的意思:将pa指针指向的那块内存空间还给操作系统,然后将pa指针置为空;

注意:pa必须是动态开辟的内存空间的起始地址;

最后将pa指针置为空的原因是:虽然将内存空间还给操作系统,但pa还是指向那块内存空间,但又无法访问那块内存空间,pa变成了所谓的野指针,因此要将pa=NULL;


我们通常将malloc和free结合起来,使用malloc开辟内存空间,利用free来完成空间的释放,两个搭配起来使用。

我们如果只开辟内存空间而不进行释放的话:

一方面:在程序运行结束后操作系统会帮助我们进行内存空间的回收;

另一方面:如果程序一直在运行申请的空间不会得到回收,而又不断地申请空间,那就会造成内存泄漏问题(可以使用的内存容量不断地在减少)造成电脑死机等问题。


2. calloc

calooc:与malloc功能类似也用来动态内存分配;

使用格式:void* calloc (size_t num, size_t size);

函数功能:num个大小为size的元素开辟一块空间,并且把空间的每个字节初始化为0

与malloc的区别:calloc会在返回地址之前把申请的空间的每个字节初始化为全0

 使用示例:

int* p=calloc(10, sizeof(int));

此句代码的意思:在内存中开辟一块大小为10*sizeof(int)的内存空间,并将此空间的首地址返回给p,并将这些内存空间全部初始化为0;

 总结:

1. 我们对申请的内存空间的内容要求初始化,那么可以很方便的使用calloc函数来完成任务。

2.calloc开辟的内存空间也要通过free释放;


3. realloc

realloc函数的出现让动态内存管理更加灵活。有时会我们发现过去申请的空间太小了,有时候我们又会觉得申请的空间过大了,那为了合理的时候内存,我们一定会对内存的大小做灵活的调整。那realloc函数就可以做到对动态开辟内存大小的调整。
使用格式: void*  realloc ( void*  ptr , size_t  size );
ptr:是要调整的内存地址;
size:调整之后新大小;
返回值:调整之后的内存起始位置。
这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到 的空间。
realloc 在调整内存空间的是存在两种情况:
情况1: 原有空间之后有足够大的空间,直接在后面追加;
情况2: 原有空间之后空间不够,重新开辟一块新的能够存放(原有+追加)的空间,并将其内容复制过去。

三、C程序的内存开辟 

下面简单介绍一下C程序在内存中的存放情况。

内存中有三区(堆区、栈区、静态区),各区存放情况如下:

堆区:malloc、calloc、realloc、free动态内存分配

栈区:局部变量、形参;

静态区:全局变量、静态变量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瞳绣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值