动态内存管理4大函数的进阶

!!‧✧̣̥̇‧✦‧✧̣̥̇‧✦ ‧✧̣̥̇:Solitary-walk

      ⸝⋆   ━━━┓
     - 个性标签 - :来于“云”的“羽球人”。 Talk is cheap. Show me the code
┗━━━━━━━  ➴ ⷯ

本人座右铭 :   欲达高峰,必忍其痛;欲戴王冠,必承其重。

 


     希望在看完我的此篇博客后可以对你有帮助哟

  此外,希望各位大佬们在看完后,可以互赞互关一下,看到必回


 目录:

一:前言

二:malloc( )

三:free( )

四:calloc( )

五:realloc( ) 

六:经典错误


一:前言

在此之前,我们一直都是通过创建变量和数组的方式来进行空间的开辟

不知道我们是否想过这样一个问题:

当我们对数组的空间开的过小或者是过大怎么办?数组空间过大会造成空间浪费而空间国小会对后续的程序产生一些问题。

这时候我们或许就会问:那有没有一些相关的函数对内存的申请是按需开辟的?

接下来我们介绍动态内存管理的4个相关函数

二:malloc( )

动态内存管理4大函数的进阶_第1张图片

 1)malloc的参数:必须指定要开辟空间的大小,单位是字节

2)函数若开辟成功会返回指向这个开辟空间的指针

3)函数若开辟失败会返回一个NULL

4)注意若是给参数传一个0,这是标准未定义的

5)malloc不会对开辟的空间进行初始化(随机值

 动态内存管理4大函数的进阶_第2张图片

三:free( )

动态内存管理4大函数的进阶_第3张图片

 free函数功能:释放被malloc / calloc/realloc开辟出来的空间

注意:

free() 只能用于被动态内存开辟出来空间的释放,对于非动态内存开辟的空间是不可以的

free(p) 注明:p = NULL,这个是支持的

四:calloc( )

动态内存管理4大函数的进阶_第4张图片

 calloc() 和malloc()相比没有什么质的不同,calloc()也是进行内存的申请,只不过参数多了一个指定的大小(多少个元素),其次就是这个函数会在返回开辟空间的地址之前默认初始化为0

 动态内存管理4大函数的进阶_第5张图片

五:realloc( )

动态内存管理4大函数的进阶_第6张图片

 realloc( ) 是对内存重新进行调整,可以对指定的内存进行扩容也可以进行缩小

1)  第一个参数:指向要调整空间的地址,注意这个空间必须是被动态内存开辟出来的

2)第二个参数:调整之后新的空间大小,注意不是新增空间或者要减小空间的大小

3)当用realloc( ) 对空间进行增容会有两种情况:一个是原地扩容,另一个是异地扩容

4)当realloc 进行异地扩容的时候会进行以下操作

对原有空间的数据进行拷贝到新的空间

释放旧的空间

返回新的空间的起始地址

 动态内存管理4大函数的进阶_第7张图片

六:经典错误
1.对NULL解引用

动态内存管理4大函数的进阶_第8张图片

 想一想以上代码为什么会崩了?

这就是对NULL的解引用

因为此时malloc失败,会返回空指针,即此时的 p == NULL

*p = 1;是错误的

2.动态内存的越界访问

动态内存管理4大函数的进阶_第9张图片

 malloc开辟的空间就是10个int类型的数据

下面进行打印的时候是对100个数据进访问,这就造成了动态内存的越界访问

3.对动态开辟内存的多次free

动态内存管理4大函数的进阶_第10张图片

 但是当我第一次free后,对p及时置空,后面在进行多次的free就没有问题

因为这是free( )函数支持的

4.释放动态开辟内存的一部分

动态内存管理4大函数的进阶_第11张图片

这是不支持的

5对非动态内存的释放

动态内存管理4大函数的进阶_第12张图片

结语:

对于动态内存开辟相关的4大函数,在数据结构的学习中是非常重要的,因为数据结构对数据的管理主要是在堆上进行的,到时候你就看吧,以写一个不吱声,很容易出现内存管理的报错,当然程序出现崩溃是必不可少的,所以对动态内存管理咱们一定要打好基础,当然我也希望各位老铁们在看到我的此篇博客后可以对动态内存管理有一定自己的了解

你可能感兴趣的:(C语言进阶讲解,javascript,开发语言,ecmascript)