10

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

4

7 回答 7

4

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

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

一些例子:

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

就我对语言的理解而言,缓冲区是内存中存储数据的任何部分,例如 int、float 变量、字符数组等。

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

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

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

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

于 2010-07-17T18:40:33.773 回答
1

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

于 2010-07-17T18:32:05.277 回答
0

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

于 2010-07-17T18:30:18.607 回答
0

根据维基百科

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

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

于 2010-07-17T18:32:00.207 回答
0

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

于 2010-07-17T18:33:14.697 回答
0

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

于 2015-05-26T23:58:38.203 回答