【问题标题】:What's a buffer?什么是缓冲区?
【发布时间】:2010-07-17 18:27:40
【问题描述】:

就我对语言的理解而言,缓冲区是内存中存储数据的任何部分,例如 int、float 变量、字符数组等。 但是,我正在阅读缓冲区溢出并在阅读有关堆栈时遇到此链接http://www.tenouk.com/Bufferoverflowc/Bufferoverflow2a.html 此链接中的图表将缓冲区与函数的局部变量分开。它是否正确?那么什么是缓冲区呢?

【问题讨论】:

标签: buffer theory buffer-overflow


【解决方案1】:

非常抽象的类比:局部变量就是您现在正在使用的;它们就是你手中的东西。缓冲区之于数据源就像勺子之于汤碗,量杯之于水龙头。手里拿着勺子比手里拿着汤碗更实用,而且几乎不可能手里拿着流动的水流。无论哪种情况,您都在使用这些器具,以便您可以以适合自己的速度喝汤/水。

更具体地说,局部变量只是您在函数内部而不是外部声明的变量。缓冲区是一块内存(通常是一个数组),用于从巨大的数据源复制一小块数据,因此您可以以计算机或程序可以处理的任何速度处理它。如果您想要另一个函数来填充缓冲区,您可以在函数外部声明缓冲区,或者如果您要填充它并自己使用它,您可以将其声明为局部变量。这是一个非常笼统的术语。

一些例子:

  • 音频缓冲区可能会保存大约 0.5 秒的音频,以便从声卡复制到程序内存以供程序处理,或从程序内存复制到声卡以输出到扬声器。您的程序可以立即解码一个 mp3 文件并将所有数据转储到您的卡中,但如果这样做,它最终会达到几百 MB 的量级,而且您不会喜欢以 50 倍的速度听音乐——所以它会一点一点地解码,并将其存储在缓冲区中。
  • 当您开始播放视频时,YouTube 的内存和/或硬盘中的视频缓冲区可能会被填满,因此您不会因为互联网连接太慢而每隔几秒就暂停一次。
  • 程序可能使用字符缓冲区将一些文本从一个函数共享到另一个函数。如果您使用 cin 或 ReadLine 或 gets 或其他东西从键盘获取一些文本输入,那么调用它存储在“字符缓冲区”中的字符串是公平的。在这种情况下,您需要将缓冲区声明为局部变量。

【讨论】:

    【解决方案2】:

    据我了解 语言去,缓冲区是任何 数据所在的内存部分 像 int、float 变量一样存储, 字符数组等

    嗯,不只是任何数据,如果是这样的话,所有变量都将存储在缓冲区中,并且该术语将毫无意义。

    缓冲区是当数据从一个地方传到另一个地方时用于临时存储的东西。通常缓冲区包含的不仅仅是单个变量,但当然也有缓冲区非常小的特殊情况。

    局部变量可以用作缓冲区,因此将分配在堆栈上,但是由于缓冲区通常很大,因此占用大量堆栈空间是不切实际的,因此通常将它们分配到其他地方。

    使用缓冲区的一个例子是当您的程序从文件中读取时。在较低级别,磁盘只能以扇区为单位读取,因此系统将一堆扇区读取到缓冲区中,然后您的程序从缓冲区中读取。

    【讨论】:

      【解决方案3】:

      在您链接到的页面上,将“Buffer”视为“我们关心的唯一局部变量”,并将“本地声明的变量”视为“不是 Buffer 的所有本地声明的变量。”

      【讨论】:

        【解决方案4】:

        不要太从字面上理解该图表。你的第一个定义是正确的。该缓冲区可以是局部变量,也可以位于堆上或其他内存区域中……这是一个非常笼统的概念。

        【讨论】:

          【解决方案5】:

          根据Wikipedia

          在计算中,缓冲区是一个内存区域,用于在数据从一个地方移动到另一个地方时临时保存数据。通常,数据在从输入设备(如键盘)检索时或在发送到输出设备(如打印机)之前存储在缓冲区中。但是,当在计算机内的进程之间移动数据时,可以使用缓冲区。这与电信中的缓冲区相当。缓冲区可以用硬件或软件实现,但绝大多数缓冲区都是用软件实现的。当接收数据的速率与处理数据的速率之间存在差异时,或者在这些速率可变的情况下(例如在打印机假脱机程序或在线视频流中),通常会使用缓冲区。

          通常这种意义上的缓冲区是一个包含许多字节数据的数组,而不是像整数这样只能保存单个值的变量。

          【讨论】:

            【解决方案6】:

            buffer 只是一块用于存储任意数据的内存。在图中,我认为“缓冲区”旨在显示声明为局部变量的缓冲区,例如char myString[80];。危险在于,如果没有严格监控放入此缓冲区的数据长度,您可以例如strcpy(...) 一些数据进入缓冲区并溢出结束 - 此时保存的寄存器将被踩踏,并且从函数返回可能(并且几乎肯定会)造成严重破坏。

            【讨论】:

              【解决方案7】:

              它只是一个分配的内存块,可以临时保存任意数据。要记住的是,如果您分配了一块内存,请务必在完成后释放它,以防止发生溢出和其他意外行为。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2012-06-21
                • 2010-10-13
                • 1970-01-01
                • 2020-04-24
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多