动态内存分配和静态内存分配,动态内存分配和释放的操作
大家好,今天我们给大家带来的是关于动态内存分配的知识。今天我们将讨论三个函数,malloc、calloc和realloc。
我先简单介绍一下动态内存的作用,先让你了解一下数组。
在学习动态内存函数之前,其实我们一直都在用数组,用数组来开辟内存,比如
这样,我就创建了一个可以容纳十个整数元素的数组,也就是40个字节。一个整数是4个字节,十个是40。但是,如果数组中没有十个元素,我们就放五个。那么,我们剩下的五行位置是不是浪费了?毕竟编译器没有聪明到看出来你不要后面的字节,他会一直给你留着。那是浪费内存吗?换句话说,如果我要存储15个元素,我的十个元素的大小不够吗?肯定会造成越界的错误,所以我们接下来要讲的动态记忆功能可以解决这些问题。
Malloc将向您展示malloc函数的参数类型和返回类型。
1.返回的指针指向打开的内存块的开始。
2.因为新分配的内存还没有初始化,所以可能会被初始化
存储的值是随机值,我们后面会讲到初始化内存的函数。
3.如果我们打开0字节,在不同的编译器中,我们的返回值可能是空指针,因为打开失败了,也可能不是空指针,就像在VS中一样。
可以看到,vs的返回值是非空指针,没有输入if的判断。
4.更重要的是,如果我们的内存开发失败了,那么它将返回一个空指针。如果我们给内存开发失败的空指针赋值,会出现意外错误,如下图所示。
当我们给int*p分配的内存太大,编译器无法处理时,我们会报告一个错误。最后就是如上图。
所以要避免这种事情,我们需要做一个判断。
这样就可以避免空指针返回后再赋值给空指针,从而避免错误的赋值。
5 .免费,这个功能不重要,但是没有它是不行的。它的作用是释放之前已经打开的内存。如果不释放内存,就会造成内存泄漏,这在我们这些小程序员中并不明显。但是,像腾讯、阿里这样的大公司,一个程序有几百万行代码,如果有导致内存泄露的地方,修复起来会异常困难。虽然程序会在return 0后结束,所有的内存都会被释放,但是有些程序可能会运行一周或者一个月。如果这期间不自己释放内存,真的会造成严重的内存泄露,到最后内存不够就崩溃了,真的无处可哭。
卡洛克
1.这是胼胝体功能。向您解释它的参数和返回类型。
例如,如果我想要四个int类型的元素,我可以使用
这相当于开辟了一个4*4=16字节的空间,实际上就是元素的个数元素的大小。
2.如你所见,如前所述,calloc函数返回初始化的内存块,所以我们可以看到,
如果我们不赋值,就会直接打印出来。
0,因为我们的内存是初始化的,这是calloc和malloc函数的主要区别。
当然malloc函数中引入的内存泄露和内存打开不成功也会在calloc函数中进行判断,所以你可以看到我每次打开内存都会进行if判断。
Realloc带你完成realloc函数。
、
在介绍完这四个框之后,我们先带大家了解一下realloc函数的返回类型和函数的参数类型。
解释下面方框中的知识。
1.改变指向内存块的大小,很好理解。可以看到下图。
你可以看到,上面的calloc函数开了4*4=16字节,但是下面的realloc函数之后,我的P的大小是100字节,所以我们给P分配了100字节,但是你可能会问,下面的判断是什么意思?为什么不能直接传给P?为什么需要判断呢?接下来,我们将讨论第二个盒子。
2.为什么他说内存块可能会移到新的位置?这就涉及到这个P指针后面的空间能否容纳后面开辟的空间。我给你画出来。
大家看看这个情况。在我们打开的记忆背后还有一些多余的空间,可以让我们扩展它。那些蓝色方块是这段记忆中被占据的地方。这种情况下,我们可以直接增加P的内存容量,但是还有一种情况。
在这个空间里,你可以看到,这个内存后面的内存空间已经不能再扩展了。如果非要扩展的话,后面内存中的信息可能会包含在我的内存中,这样会产生问题,可以换个方法。
我们可以开辟一个新的内存块,先复制上层内存中的值,后面扩展的内存不会覆盖后面的内存,这样就可以避免上述问题。还有一个小知识点,因为我们P指针里的内存里的值都被复制到ptr里了,P指针里面的空间就被这个函数释放了,回到了电脑里。这样很方便,但是我们不知道什么时候扩展会失败,所以每次都扩展内存。
3.意味着原来的内容会保留在新打开的内存的低位地址,即使打开了一个新的空间。但如果打开的内存大于前面的地址,后面新容量的内容将是一个不确定的值,即随机值。
4.
如果这是一个空指针,该函数的行为类似于,分配一个新的字节块,并返回一个指向其开头的指针。
你什么意思?
其实意思很简单,就是如果我们扩展一个空指针的内存,
如你所见,P是一个空指针。如果你想扩展P的内存,没问题。大概意思是malloc函数。展开的内容都是随机值,返回值是指向其开头的指针。
5.另外很重要的一点是,我们的realloc实际上可以减少自己的内存大小,如下图所示:
我们给intp 20字节的空间,分别给(p i)赋值,得到图片右侧的内存。
但是我后来在P的内存上做了realloc来缩短内存,这样我们的打印就变成了因为我们的内存变成了8个字节,只够打印两个形状,所以下面的值就变成了随机值,因为内存没有被覆盖或涉及,也可以通俗地说(减少内存就是把原来内存的内容截断)。
亲爱的朋友们,我们先来了解一下这个讲座中的动态内存管理。后面我会解释一些经典问题,后续会发。可以散步三次。谢谢大家!
,
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。