2010-07-17 118 views
9

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

+1

缓冲区是清理和抛光我的车的人:)但严重的是,http://en.wikipedia.org/wiki/Data_buffer上有很多很好的例子。 – nas 2010-07-17 18:35:02

回答

0

不要太字面意思。你的第一个定义是正确的。该缓冲区可以是一个局部变量,也可以位于堆中或其他内存区域中......这是一个非常普遍的概念。

0

根据Wikipedia

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

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

1

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

0

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

1

至于我的 语言理解推移,缓冲器是任何 的其中数据是 存储像int存储器部分,浮动变量, 字符数组等

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

缓冲区是当数据来自一个地方并转到另一个地方时用于临时存储的东西。通常情况下,缓冲区保存的不止是单个变量,但当然也存在缓冲区很小的特殊情况。

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

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

4

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

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

一些例子:

  • 音频缓冲区可能持有约0.5秒价值音频从声卡复制到程序内存的程序来处理,还是从程序内存的声卡输出到扬声器。你的程序可以立即解码一个mp3文件并将所有的数据转储到你的存储卡上,但是如果这样做的话它最终会达到几百MB,而你不会喜欢以50倍速度听音乐 - 所以它一点一点解码,并将其存储在缓冲区中。
  • 当您启动视频时,视频缓冲区可能会填充到您的内存和/或来自YouTube的硬盘中,因此您不会每隔几秒暂停一次,因为互联网连接速度太慢。
  • 程序可能会使用字符缓冲区来将一些文本从一个功能共享到另一个功能。如果使用cin或ReadLine或者从键盘获取某些文本输入,那么调用存储在“字符缓冲区”中的字符串将是公平的。在这种情况下,你需要将缓冲区声明为局部变量。
0

它只是一个分配的内存块,可以暂时保存任意数据。要记住的事情是,如果你分配了一块内存,一旦完成后一定要释放它,以防止发生溢出和其他意外行为。