C的动态内存

       在数组问题中,常常会遇到需要创建长度为变量的数组,通常的数组定义就不能满足这一要求了,这时就有动态内存的出场了。动态内存是一个动态创建大内存的概念,它存在于stdlib.h这一头文件里,其中有malloc、calloc、realloc、free这四个函数来表示动态内存。

1.malloc

     malloc是分配内存块的函数。通常在Windows中,堆中最大的连续内存大概1.3G左右,这也是函数可分配得到的最大连续内存。void *malloc(size_t  size),在这个定义中,可以看出,这个函数只有分配的字节这一个参数。同时还有一个重要的返回值,当可分配的内存不足时,该函数返回了无效的指针传递给分配空间或NULL。

int *p = (int *)malloc(10*sizeof(int));这一句对指针的内存分配就相当于int p[n];(n为变量)

                                                                                                         图1 

上图表示将400字节的内存分配给p,同时对p进行初始化置零。 这一函数可以跟简便地使用calloc这一函数实现。

2.calloc

     calloc是分配内存中的一个数组的元素初始化为0的函数。void  *calloc(size_t  num,size_t  size),在这个定义中,可以看出,这个函数有元素的数目和字节长度两个参数。

                                                                                                            图2 

 图2这一语句就等同于图1。

3.realloc

     realloc是重新分配内存块的一个函数。对于重新分配内存,我们可以使用malloc这一函数进行实现:

                                                                                                               图3 

     可以看出,重新分配内存使用for循环和malloc函数不是很简便,realloc这一函数就能很好的解决这一情况。 

void  *realloc(void  *memblock,size_t  size);这一定义中,有两个参数分别是对以前指定的指针内存块、新的字节大小。

                                                                                                                 图4 

合理使用这一函数可以对代码进行更好的精进。看到这里,你就会发现在这有了free这一函数了。

4.free

     free是释放内存块的函数,它用来释放有calloc、malloc、或realloc调用的此前分配的内存块,所以在使用了调用内存的函数之后,一定要进行内存释放,否则内存泄漏就会造成影响。void free(void  *memblock);在这个函数中只有一个定义,需要释放的此前分配过的内存。而在使用它的时候也一定要谨慎小心,不然它会造成你程序崩溃,以下就是free函数造成崩溃的四个原因。

(1)越界

       再回去看malloc的定义,你就会发现定义中的参数是分配的字节,而不是上图中一个整型数字20,程序就会强行认为20就是字节,这就造成了数组越界,导致程序崩溃。

(2)指针移动,找不到头

对于这一原因我们可以抽象地用图来进行演示。

       我们在进行对指针p初始化时,p指在了对其分配的内存块开始处,也就是第一个格子的头,程序进入for循环中,p指向发生了变化,p++使它指向了第二个格子,循环继续,以此类推,p继续后移,这时再进行内存释放,系统找不到需要释放的内存块的头,然后造成崩溃。

(3)重复释放内存

 这个代码中第二句已经将p进行赋值给了q,对p、q重复释放也是造成程序崩溃的原因之一

(4)释放不是动态创建的内存

这个很简单,对a赋值为10,a分配得到的内存不是动态内存,当然也会崩溃。

到此,动态内存就介绍完了,学会动态内存对今后的C语言学习有很大帮助,对此我们也应该去好好地掌握住它。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值