<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>PWN on UKFC 安全团队 Cyber-Security</title>
        <link>https://ukfc.twilightly.top/categories/pwn/</link>
        <description>Recent content in PWN on UKFC 安全团队 Cyber-Security</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <copyright>UKFC</copyright>
        <lastBuildDate>Sun, 20 Apr 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://ukfc.twilightly.top/categories/pwn/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>CTF知识树-PWN 侧信道爆破简述</title>
        <link>https://ukfc.twilightly.top/bilibili/lo0-%E4%BE%A7%E4%BF%A1%E9%81%93%E7%88%86%E7%A0%B4%E7%AE%80%E8%BF%B0/</link>
        <pubDate>Sun, 20 Apr 2025 00:00:00 +0000</pubDate>
        
        <guid>https://ukfc.twilightly.top/bilibili/lo0-%E4%BE%A7%E4%BF%A1%E9%81%93%E7%88%86%E7%A0%B4%E7%AE%80%E8%BF%B0/</guid>
        <description>&lt;h2 id=&#34;视频&#34;&gt;视频
&lt;/h2&gt;





    


&lt;div class=&#34;video-wrapper&#34;&gt;
    &lt;iframe src=&#34;https://player.bilibili.com/player.html?as_wide=1&amp;amp;high_quality=1&amp;amp;page=1&amp;bvid=BV1exLczEEja&#34;
            scrolling=&#34;no&#34;
            frameborder=&#34;no&#34;
            framespacing=&#34;0&#34;
            allowfullscreen=&#34;true&#34;
    &gt;
    &lt;/iframe&gt;
&lt;/div&gt;

&lt;h2 id=&#34;参考资料&#34;&gt;参考资料
&lt;/h2&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://pan.twilightly.top/d/share/UKFCWEB/lo0-%E4%BE%A7%E4%BF%A1%E9%81%93%E7%88%86%E7%A0%B4%E7%AE%80%E8%BF%B0/sca.tar.gz?sign=VTUV-_G5DcEClvKIVoFQFKagSqfw2o_OD3BpHffEl6Y=:0&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;视频中相关代码下载&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.cnblogs.com/ZIKH26/articles/16546513.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;关于侧信道爆破的学习总结&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Pwn - 堆利用 Heap_Exploit</title>
        <link>https://ukfc.twilightly.top/p/pwn-%E5%A0%86%E5%88%A9%E7%94%A8-heap_exploit/</link>
        <pubDate>Sat, 14 Sep 2024 00:00:00 +0000</pubDate>
        
        <guid>https://ukfc.twilightly.top/p/pwn-%E5%A0%86%E5%88%A9%E7%94%A8-heap_exploit/</guid>
        <description>&lt;h1 id=&#34;堆利用-heap-exploit&#34;&gt;堆利用 Heap Exploit
&lt;/h1&gt;&lt;p&gt;个人认为：堆是庞大而又复杂的东西，要想真正的认识堆，把堆搞明白了，也是需要一段时间的。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;提示：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;文章偏新手向，我就一个新手只能写出新手向的文章，所以说它更适合新手，我会用更加详细的语言去描述某些知识点，如果老东西们发现文章有什么问题们请狠狠的提出不足，谢谢。&lt;/li&gt;
&lt;li&gt;由于众所周知的原因，随着 libc 版本的更迭，堆呈现出来的性质也是不一样的，一般入门的话都是从旧版本的堆的特性开始学习，在之后的内容会逐步讲解更高版本 libc 涉及到的堆的特性，所以文章所有用来编译的程序均是在安装了 glibc-2.23 的系统上编译的，如果你也想自己尝试编译一下，那么多安装一个 Ubuntu 16 是再好不过了。（或者是下文的 pwndocker 应该也行）&lt;/li&gt;
&lt;/ol&gt;&lt;/blockquote&gt;
&lt;p&gt;前置内容：&lt;/p&gt;
&lt;p&gt;由于堆的特性与 libc 的版本息息相关，而大部分人都会使用最新最热的 kali - linux 系统，如果你是官网下载的船新版本，你需要更换你的 libc 版本，当然对于向 glibc 这样系统依赖性很强的东西贸然降级是很危险的，所以你可以使用下面几种方法：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;patchelf&lt;/code&gt; 和 &lt;code&gt;glibc-all-in-one&lt;/code&gt; 前者可以指定某个二进制文件使用对应的 libc 运行，后者则是可以方便你下载各个版本的 libc ，具体用法可以百度。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在你写的脚本中打开本地进程这么写：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;([&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34; ld 路径 &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;./题目&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;LD_PRELOAD&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34; libc 路径 &amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果你热爱配环境的话可以使用 skysider / pwndocker 这样牛逼的工具，&lt;del&gt;我认得的老东西说牛逼的老东西都用这个&lt;/del&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;对于调试环境（个人向）喜欢将 gdb 的插件配置为 &lt;code&gt;pwndbg&lt;/code&gt; + &lt;code&gt;pwngdb&lt;/code&gt; 。（注意不是一个东西）&lt;/p&gt;
&lt;h2 id=&#34;一-与堆的初次见面&#34;&gt;一 、与堆的初次见面
&lt;/h2&gt;&lt;h3 id=&#34;11-堆是什么&#34;&gt;1.1 堆是什么？
&lt;/h3&gt;&lt;p&gt;学过C语言的都知道，在C语言中，内存管理有&lt;u&gt;动态内存管理、静态内存管理、自动内存分配&lt;/u&gt;三种办法。当然我们的重点并不是后两个，如果你没学过这方面可以了解一下。其中，动态内存管理就是对堆的利用。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;动态内存&lt;/strong&gt;，也称为堆内存。堆内存在&lt;strong&gt;手动释放&lt;/strong&gt;或&lt;strong&gt;程序结束&lt;/strong&gt;之前均可访问，同时允许我们在&lt;strong&gt;程序执行期间随时分配和释放内存&lt;/strong&gt;，它非常适合&lt;strong&gt;存储大型数据结构&lt;/strong&gt;或&lt;strong&gt;大小事先未知的对象&lt;/strong&gt;。堆使得程序员分配内存变得更加灵活，在一定程度上也解决了内存不足的问题。&lt;/p&gt;
&lt;h3 id=&#34;12-堆在哪里&#34;&gt;1.2 堆在哪里？
&lt;/h3&gt;&lt;p&gt;　　当&lt;strong&gt;申请（使用 malloc() 函数）内存块后&lt;/strong&gt;，堆段才会出现，堆&lt;strong&gt;由低地址向高地址方向增长&lt;/strong&gt;，当我们在 &lt;code&gt;pwndbg&lt;/code&gt; 中使用 &lt;code&gt;vmmap&lt;/code&gt; 指令可以看到 heap 段在内存中的位置：&lt;/p&gt;
  &lt;div  align=&#34;center&#34;&gt;
    &lt;img src=&#34;1.2-001.png&#34; width = &#34;70%&#34; height=&#34;50%&#34; /&gt;&lt;/br&gt;
    &lt;img src=&#34;1.2-002.png&#34; width = &#34;70%&#34; height=&#34;50%&#34; /&gt;&lt;/br&gt;
    可以看到，堆在内存中的位置处于栈区 &lt;span alt=&#34;hm&#34; title=&#34;你知道的太多了&#34;&gt;(内存映射段)&lt;/span&gt;与数据段之间，并且紧邻着数据段。
  &lt;/div&gt;  
&lt;h3 id=&#34;13-堆从哪里来&#34;&gt;1.3 堆从哪里来？
&lt;/h3&gt;&lt;p&gt;&lt;del&gt;&lt;em&gt;当然是申请来的(即答)&lt;/em&gt;&lt;/del&gt;，那么&lt;strong&gt;当我们在程序中第一次申请了一块空间时到底发生了什么？&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;提前科普——为了防止你会懵 B 所以对于有些下文会提到但是已经涉及到的东西讲解一下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Top chunk：当程序第一次进行 malloc 的时候，heap 会被分为两块，一块给用户，剩下的那块就是 top chunk ，再次申请堆块要是没有合适的空间便会使用 top chunk 的空间。&lt;/li&gt;
&lt;li&gt;你申请到的一块堆内存的起始地址 ≠ 你可以写入数据的起始地址，因为堆块头部会记录一些信息，所以你会看到下面的示例中有 0x10 大小差距。&lt;/li&gt;
&lt;li&gt;你申请的大小 ≠ 实际申请的大小，他会有一个的取整的步骤。&lt;/li&gt;
&lt;/ol&gt;&lt;/blockquote&gt;
&lt;p&gt;我准备了下面的程序来演示：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;p&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;NULL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;p&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;malloc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x114&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;p&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;malloc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x514&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;p&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;malloc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x1919&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;p&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;malloc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x810&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;（1）第一次申请之前&lt;/strong&gt;，在我们申请内存之前，堆段并没有出现。&lt;/p&gt;
  &lt;div  align=&#34;center&#34;&gt;
    &lt;img src=&#34;1.3-001.png&#34; width = &#34;70%&#34; height=&#34;50%&#34; /&gt;&lt;/br&gt;
  &lt;/div&gt;  
&lt;p&gt;&lt;strong&gt;（2）第一次申请后&lt;/strong&gt;，堆段被建立了。&lt;/p&gt;
&lt;p&gt;　　　通过&lt;code&gt;vmmap&lt;/code&gt;观察堆的size，我们得到了&lt;strong&gt;21000字节的堆内存&lt;/strong&gt;。&lt;/p&gt;
  &lt;div  align=&#34;center&#34;&gt;
    &lt;img src=&#34;1.3-003.png&#34; width = &#34;70%&#34; height=&#34;50%&#34; /&gt;&lt;/br&gt;
  &lt;/div&gt; 
&gt; 为什么图片中堆的长度是21000，和实际申请的大小差距很大？
&gt;
&gt; 事实上，当申请堆的内存时，我们可以随时随地申请，而且每次申请的内存有大有小，管理申请的堆的工作量会非常大，而申请内存呢肯定是要向系统申请的，那么不妨假设一下，如果 malloc（）函数仅仅封装了可以分配内存的系统调用（比如 brk 和 mmap ，本人也不太明白，有兴趣可以了解相关的系统调用），那么频繁地调用系统调用会很消耗系统资源。
&gt;
&gt; 所以针对这个问题,程序第一次可能只是向操作系统申请很小的内存，但是为了方便，操作系统会把很大的内存分配给程序。这样的话可以避免上面假设所说的频繁系统调用，就避免了多次内核态与用户态的切换，提高了程序的效率。
&lt;p&gt;&lt;strong&gt;（4）再从得到的内存上分配所申请的相应的小段内存&lt;/strong&gt;，称为&lt;u&gt;&lt;strong&gt;Chunk&lt;/strong&gt;&lt;/u&gt;（Allocated Chunk），并返回地址给程序。&lt;/p&gt;
  &lt;div  align=&#34;center&#34;&gt;
    &lt;img src=&#34;1.3-002.png&#34; width = &#34;70%&#34; height=&#34;50%&#34; /&gt;&lt;/br&gt;
    辣个&#34;Allocated Chunk&#34;就是我们申请的内存啦&lt;/br&gt;
  &lt;/div&gt; 
**（5）如果你申请了很多的堆块，不考虑释放堆块，那他们会按申请的顺序依次从低地址到高地址排列**。
 &lt;div  align=&#34;center&#34;&gt;
  &lt;img src=&#34;1.3-004.png&#34; width = &#34;70%&#34; height=&#34;70%&#34; /&gt;&lt;/br&gt;
  &lt;img src=&#34;2.1-006.png&#34; width = &#34;40%&#34; height=&#34;40%&#34; /&gt;&lt;/br&gt;
 &lt;/div&gt; 
&gt; 从系统调用得到的内存又是怎么样分配的呢？
&gt;
&gt; glibc有自己的内存管理器来进行内存分配操作——Ptmalloc2，它实现了各种对堆的分配，回收，合并，切割等操作。对应的，不同环境也有不同的堆管理器，而针对堆的特性介绍与漏洞利用也与Ptmalloc2息息相关。
&lt;h3 id=&#34;14-堆的归宿是哪里堆如何发挥作用&#34;&gt;1.4 堆的归宿是哪里？（堆如何发挥作用？）
&lt;/h3&gt;&lt;p&gt;观前提示：使用有关堆的函数前需要头文件 stdlib.h 。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;提前科普：&lt;/p&gt;
&lt;p&gt;一般使用 free() 函数释放的堆块不会立刻被回收，它们会变成一种叫 Free Chunk 的东西并且加上了一种类似 xxx bin 的名字，一般这类堆块释放后如果挨着一个也被释放的堆块或者是 Top Chunk 会合并，当然请记住 Fast Bin 是一个特例 —— 它不会轻易合并。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;（1）malloc() 函数：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;分配所需的内存空间，并返回一个指向它的指针&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;malloc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;size_t&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;参数size：要分配的字节大小，&lt;strong&gt;是无符号数&lt;/strong&gt;，如果你输入了了 -1 ，理论上会有一个很大很大的堆，实际上会报错，因为确实很大！
返回值：如果分配成功，则返回指向分配内存的指针；如果分配失败，则返回 NULL。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;（2）calloc() 函数：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;分配所需的内存空间，并返回一个（一组）指向它（它们）的指针。
&lt;strong&gt;malloc 和 calloc 之间的不同点是，malloc 不会设置内存为零，而 calloc 会设置分配的内存为零。&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;calloc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;size_t&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;nitems&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;size_t&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;参数 nitems ：需要的堆块数量，&lt;strong&gt;也是无符号数&lt;/strong&gt;。
返回值：如果分配成功，则返回一个（一组）指向分配的堆块（堆块们）的指针；如果分配失败，则返回 NULL。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;重点：（3）realloc() 函数：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;更改已经配置的内存空间，即更改由 malloc() 函数分配的内存空间的大小。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;realloc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ptr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kt&#34;&gt;size_t&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;size&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;参数 *ptr ：一个指针，指向堆块或者为空。
返回值：看情况，下文会说。&lt;/p&gt;
&lt;p&gt;1）如果重新申请的大小大于申请内存的大小，且当前内存段后面有需要的内存空间，则直接扩展这段内存空间，realloc() 将返回原指针。
2）如果重新申请的大小大于申请内存的大小&lt;strong&gt;且当前内存段后面的空闲字节不够&lt;/strong&gt;，那么就使用堆中的第一个能够满足这一要求的内存块，&lt;strong&gt;将目前的数据复制到新的位置，并将原来的数据块释放掉，返回新的内存块位置&lt;/strong&gt;，相当于 free()  +  malloc() 。
3）&lt;strong&gt;如果重新申请的大小小于申请内存的大小&lt;/strong&gt;，堆块会直接缩小，被削减的内存会释放。&lt;/p&gt;
&lt;blockquote alt=&#34;warn&#34;&gt;&lt;p&gt;
    &lt;font title = &#34;yellow&#34;&gt;提示：&lt;/font&gt; 这里的释放不是和 free() 函数一样的释放，而是区别于 free() 函数的释放内存方式，不过具体是什么以后再说吧。
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;4）如果传入了一个空的堆块地址，但是 size 不是 0 ，那么就相当于 malloc() 。
5）如果传入了一个正常的堆块地址，但是 size 是 0 ，那么就相当于 free() 。
6）如果申请失败，将返回 NULL ，此时，原来的指针仍然有效。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;（4）free() 函数：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;释放之前调用 calloc、malloc 或 realloc 所分配的内存空间。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;free&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ptr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;参数 ptr ：指针指向一个要释放内存的内存块。如果传递的参数是一个空指针，则不会执行任何动作，&lt;strong&gt;注意 free() 不会清除内存块的数据&lt;/strong&gt;。
无返回值。&lt;/p&gt;
&lt;p&gt;我准备了由下列代码编译的程序进行演示：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;28
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;29
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;30
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;31
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;32
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;33
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;34
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;35
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;36
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;37
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;38
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;39
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#include&lt;/span&gt; &lt;span class=&#34;cpf&#34;&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;span class=&#34;cp&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nf&#34;&gt;setvbuf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stdin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nf&#34;&gt;setvbuf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stdout&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nf&#34;&gt;setvbuf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;//设置缓冲区
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;NULL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;b&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;NULL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;ni&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x30&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;//验证 malloc()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;n&#34;&gt;b&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;malloc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x200&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;//隔离用，实际没有用
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;nf&#34;&gt;printf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;申请的地址为: %p&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;//验证 malloc() 返回值
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nf&#34;&gt;memset&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;sc&#34;&gt;&amp;#39;m&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x30&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;nf&#34;&gt;free&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;malloc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x30&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;//验证 malloc() 特性 (雾)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;nf&#34;&gt;memset&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;sc&#34;&gt;&amp;#39;m&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x30&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;//
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;nf&#34;&gt;free&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;calloc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x30&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// 验证 calloc() 特性
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nf&#34;&gt;free&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nf&#34;&gt;free&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;//打扫现场
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;malloc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x100&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;b&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;malloc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x200&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nf&#34;&gt;memset&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;sc&#34;&gt;&amp;#39;m&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x100&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nf&#34;&gt;memset&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;sc&#34;&gt;&amp;#39;m&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x200&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;b&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;realloc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x256&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;//扩大但后面有空间
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;realloc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x512&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;//扩大但后面无空间
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;n&#34;&gt;b&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;realloc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x200&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;//缩小但后面无空间
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;realloc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x486&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;//缩小但后面有空间
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;c&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;NULL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;c&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;realloc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mh&#34;&gt;0x114&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;//c 为 nullptr
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;  &lt;span class=&#34;n&#34;&gt;c&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;realloc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;//释放
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;malloc() 演示：&lt;/strong&gt;
我们直接打开 &lt;code&gt;gdb&lt;/code&gt;开始调试，运行到第一个申请 0x30 大小堆块的 malloc() 。&lt;/p&gt;
  &lt;div  align=&#34;center&#34;&gt;
    &lt;img src=&#34;1.4-001.png&#34; width = &#34;70%&#34; height=&#34;50%&#34; /&gt;&lt;/br&gt;
  &lt;/div&gt; 
&lt;p&gt;运行这个命令，查看堆，使用&lt;code&gt;heap&lt;/code&gt;命令，看到堆块已经建立，堆块地址为 0x602000 。&lt;/p&gt;
  &lt;div  align=&#34;center&#34;&gt;
    &lt;img src=&#34;1.4-002.png&#34; width = &#34;70%&#34; height=&#34;50%&#34; /&gt;&lt;/br&gt;
  &lt;/div&gt; 
&lt;p&gt;执行&lt;code&gt;printf&lt;/code&gt;函数，输出参数为数据的起始位置（上文提到了和堆块起始位置的不同），验证了 malloc() 会返回参数这一事实，&lt;del&gt;虽然没什么好验证的&lt;/del&gt;。&lt;/p&gt;
  &lt;div  align=&#34;center&#34;&gt;
    &lt;img src=&#34;1.4-003.png&#34; width = &#34;70%&#34; height=&#34;50%&#34; /&gt;&lt;/br&gt;
  &lt;/div&gt; 
**calloc() 演示:**
接下来我们用 m 填满申请的堆块。
  &lt;div  align=&#34;center&#34;&gt;
    &lt;img src=&#34;1.4-004.png&#34; width = &#34;70%&#34; height=&#34;50%&#34; /&gt;&lt;/br&gt;
  &lt;/div&gt; 
&lt;p&gt;看一下，已经被填好了。&lt;/p&gt;
  &lt;div  align=&#34;center&#34;&gt;
    &lt;img src=&#34;1.4-005.png&#34; width = &#34;70%&#34; height=&#34;50%&#34; /&gt;&lt;/br&gt;
  &lt;/div&gt; 
&lt;p&gt;free() 以后回来看，你会发现，填充的东西还在。&lt;strong&gt;&lt;u&gt;逝想一下&lt;/u&gt;，如果有什么本该清除不该出现的东西留下了，我们是不是就可以……&lt;/strong&gt; 至于为什么有一块是空的，是因为它在释放后会进入 fastbin ，而它作为一个单链表结构需要保存一个指针指向前一个大小相同的 fastbin 堆块，看下文把。&lt;/p&gt;
  &lt;div  align=&#34;center&#34;&gt;
    &lt;img src=&#34;1.4-005.1.png&#34; width = &#34;70%&#34; height=&#34;50%&#34; /&gt;&lt;/br&gt;
  &lt;/div&gt; 
&lt;p&gt;当你经过 calloc() 函数，发现它和前面那个就是不一样，申请的内存被清空了！&lt;/p&gt;
  &lt;div  align=&#34;center&#34;&gt;
    &lt;img src=&#34;1.4-006.png&#34; width = &#34;70%&#34; height=&#34;50%&#34; /&gt;&lt;/br&gt;
  &lt;/div&gt; 
**重点 —— realloc() 演示：**
现在让另外两个堆块表演！
  &lt;div  align=&#34;center&#34;&gt;
    &lt;img src=&#34;1.4-007.png&#34; width = &#34;70%&#34; height=&#34;50%&#34; /&gt;&lt;/br&gt;
  &lt;/div&gt; 
&lt;p&gt;也被填充满了m，现在让我们看扩大但后面有空间的情况：&lt;/p&gt;
  &lt;div  align=&#34;center&#34;&gt;
    &lt;img src=&#34;1.4-008.png&#34; width = &#34;70%&#34; height=&#34;50%&#34; /&gt;&lt;/br&gt;
  &lt;/div&gt; 
&lt;p&gt;当我们执行了第一个 realloc() 函数，第二个堆块成功的变大了，原来的内容被保留，因为后面还有空间，所以就直接占用 Top Chunk 扩大自身。&lt;/p&gt;
  &lt;div  align=&#34;center&#34;&gt;
    &lt;img src=&#34;1.4-009.png&#34; width = &#34;70%&#34; height=&#34;50%&#34; /&gt;&lt;/br&gt;
    &lt;img src=&#34;1.4-010.png&#34; width = &#34;70%&#34; height=&#34;50%&#34; /&gt;&lt;/br&gt;
  &lt;/div&gt; 
&lt;p&gt;我们来看第一个堆块的这种扩大但后面无空间的情况，上一个堆块是因为后面还有 Top Chunk，&lt;strong&gt;而第一个堆块本身就是打头的，后面还有第二个堆块，显然不能简单的扩大&lt;/strong&gt;，所以只能释放当前堆块，后面再申请一个新的，提醒一下，紫色的是刚才的第二个堆块，绿色的是新申请的。（ 好玩的地方：&lt;strong&gt;被释放的堆块内存里仍然残留着 m&lt;/strong&gt; ）。&lt;/p&gt;
  &lt;div  align=&#34;center&#34;&gt;
    &lt;img src=&#34;1.4-011.png&#34; width = &#34;73%&#34; height=&#34;53%&#34; /&gt;&lt;/br&gt;
    &lt;img src=&#34;1.4-012.png&#34; width = &#34;70%&#34; height=&#34;50%&#34; /&gt;&lt;/br&gt;
  &lt;/div&gt; 
&lt;p&gt;继续运行，我们来讨论一下堆块缩小的情况，第一种情况是紧邻这申请的堆块的堆块缩小，运行完这个函数，我们会发现缩小的堆块就在原地缩小了，地址不变，剩余部分被释放：&lt;/p&gt;
  &lt;div  align=&#34;center&#34;&gt;
    &lt;img src=&#34;1.4-013.png&#34; width = &#34;70%&#34; height=&#34;50%&#34; /&gt;&lt;/br&gt;
  &lt;/div&gt; 
&lt;p&gt;继续运行，刚才提到的堆块缩小有意思的情况来了，上文提到，Fast Bin 不轻易合并，但是当我们紧邻着 Top Chunk 呢？运行完这个函数，我们会发现缩小的堆块就在原地缩小了，但是我们等待的 Fast Bin 并没有出现，很明显是合并了，&lt;strong&gt;那么可以得出这里的释放剩余空间并不是简单的 free()&lt;/strong&gt; ：&lt;/p&gt;
  &lt;div  align=&#34;center&#34;&gt;
    &lt;img src=&#34;1.4-014.png&#34; width = &#34;70%&#34; height=&#34;50%&#34; /&gt;&lt;/br&gt;
  &lt;/div&gt; 
&lt;p&gt;继续运行，当指针为空时 realloc() 就相当于变成了 malloc() ，申请了新的堆块，如图：&lt;/p&gt;
  &lt;div  align=&#34;center&#34;&gt;
    &lt;img src=&#34;1.4-015.png&#34; width = &#34;70%&#34; height=&#34;50%&#34; /&gt;&lt;/br&gt;
    &lt;img src=&#34;1.4-016.png&#34; width = &#34;70%&#34; height=&#34;50%&#34; /&gt;&lt;/br&gt;
  &lt;/div&gt; 
&lt;p&gt;继续运行，当大小为空时该堆块释放，相当于 free() ，执行后所圈堆块被释放（看不到是被合并了）。&lt;/p&gt;
  &lt;div  align=&#34;center&#34;&gt;
    &lt;img src=&#34;1.4-017.png&#34; width = &#34;70%&#34; height=&#34;50%&#34; /&gt;&lt;/br&gt;
    &lt;img src=&#34;1.4-018.png&#34; width = &#34;70%&#34; height=&#34;50%&#34; /&gt;&lt;/br&gt;
  &lt;/div&gt; 
&lt;p&gt;&lt;strong&gt;看完上面的内容，你估计也能看出来，堆的内存分配与操作是极其复杂的&lt;/strong&gt;
&lt;strong&gt;接下来我们就来深入探讨一下吧：&lt;/strong&gt;&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
