C语言学习分享(动态内存管理)

1.什么是动态内存

我们首先来思考一下,我们要存放数据时如何向内存开辟空间。

根据我们过去的知识,我们有以下两种方式:

1.创建变量,创建一个某类型的变量(也可以是结构体变量)。

2.创建数组,创建一个大小确定的数组

显而易见,这两种方式开辟的内存空间都是固定的,大小在创建时就已经固定了,如果我们在使用时想要控制大小,比如说:我们需要100个数据,但是只有50的空间。或者我们开辟了100的空间,却只有10个数据。对内存的使用效率太低。这是就需要动态内存的出现来帮助我们解决这个问题,提高内存空间的利用率,让我们对内存的使用灵活自如。

2.与动态内存开辟的相关函数

C语言给我们提供了4个库函数,让我们实现动态开辟内存的效果,我们现在来认识一下它们。

1.malloc函数        返回值:void*的指针        参数:需要开辟的内存空间大小(单位字节)

功能:在内存的堆区上开辟一块大小可以动态变化的内存空间。

用法:我们看到上述代码中,有一个释放空间的操作使用到了free函数,这里要提出一个要点,我们动态开辟的空间,一定都要在使用完毕后用free函数进行空间的释放,否则就会出现内存泄露的问题,下面会具体讲到。

2.free函数:        无返回值        参数:需要释放的内存空间的指针        功能:将对应的内存空间进行释放操作,还给操作系统,便于下次使用。

3.calloc函数:        返回值:void*的指针        参数:1.需要存放的数据的个数 2.数据对应类型的大小(单位字节)        功能:与malloc相似,同时增加了将开辟空间的数据初始化为0的操作。

实例:

通过malloc和calloc函数,我们学会了如何动态开辟内存空间,但是好像还是无法实现让内存空间动态变化。下面的realloc函数,就可以实现这个功能了。

4.realloc函数:        返回值:void*的指针        参数:1.需要调整的内存空间的指针 2.调整后的内存空间大小(单位字节)        功能:将内存空间调整为参数给定的新的大小。

实例: 通过上面的4个函数,我们就可以实现开辟一个大小可以自由调整的内存空间了。但是在使用时,还是有一些常见的错误需要注意。

4.常见的错误

1.对空指针的解引用:
在我们开辟好一块动态内存空间后,如 malloc(),会返回一个空间起始位置的地址,我们在使用该地址时,一定要先判断该地址是否为空,来避免对空指针的解引用这一问题。
写法        if( *p == NULL)
        {    printf("%s\n",strerror(errno));
            }
2.动态内存空间的越界访问:
在我们使用动态内存空间的时候,一定要注意它的大小,动态内存虽然其空间大小是可以改变的,但是需要经过扩容操作,并非自动扩容,所以一定要注意使用前确定其空间大小,来避免越界访问的问题。

3.对非动态空间的free释放
注意只有我们开辟的动态内存空间才需要使用free函数来释放空间,其他的内存空间不需要使用free函数。错误释放会导致报错
4.使用free释放动态空间的一部分
我们在使用动态空间时,一定要注意不可以改变初始位置的地址,否则我们在使用free释放地址时,会导致传入的地址无法找到整个动态内存空间。
5.对同一动态空间的重复释放
不能多次调用free函数来释放同一块动态空间。
6.动态空间忘记释放
出现这种情况会导致内存泄露的情况。
内存泄漏:及我们向内存申请了一块空间,然后我们不再使用这一块空间后,也没有将这块空间还给操作系统,导致这块空间被浪费掉。
所以每次使用完后一定要释放内存呢。
写法
free(p)
p = NULL
注:在函数中开辟动态内存空间一定要注意,是否存在跳出函数时还未释放内存空间的情况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值