动态内存分配和静态内存分配,动态内存分配和释放的操作

  动态内存分配和静态内存分配,动态内存分配和释放的操作

  大家好,今天我们给大家带来的是关于动态内存分配的知识。今天我们将讨论三个函数,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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • office2010激活密钥大全 怎么永久激活office2010
  • project2010产品密钥免费_project2010激活密钥永久激活码
  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • chatgpt是什么?为什么这么火?
  • ChatGPT为什么注册不了?OpenAI ChatGPT的账号哪里可以注册?
  • OpenAI ChatGPT怎么注册账号?ChatGPT账号注册教程
  • chatgpt什么意思,什么是ChatGPT ?
  • CAD中怎么复制图形标注尺寸不变,CAD中怎么复制图形线性不变
  • cad中怎么创建并使用脚本文件,cad怎么运行脚本
  • cad中快速计算器的功能,cad怎么快速计算
  • cad中快速修改单位的方法有哪些,cad中快速修改单位的方法是
  • cad中心点画椭圆怎么做,cad轴测图怎么画椭圆
  • CAD中常用的快捷键,cad各种快捷键的用法
  • 留言与评论(共有 条评论)
       
    验证码: