就我对语言的理解而言,缓冲区是内存的任何部分,其中数据的存储方式类似于int,float变量,字符数组等。 但是,我正在阅读缓冲区溢出并在阅读堆栈http://www.tenouk.com/Bufferoverflowc/Bufferoverflow2a.html时遇到此链接。此链接中的图表将缓冲区与函数的局部变量分开。它是否正确?什么是缓冲呢?
答案 0 :(得分:4)
非常抽象的类比:局部变量就是你现在正在使用的东西;他们就是你手里拿着的东西。一个缓冲区是数据源,勺子是汤碗,或量杯是水龙头。握在你手中的勺子比手里拿着汤碗更实际,而且几乎不可能在你的手中握住流水。在任何一种情况下,您都在使用这些器具,以便您能够以适合您的速度饮用汤/水。
更具体地说,局部变量只是您在函数内声明的变量,而不是外部变量。缓冲区是一块内存(通常是一个数组),用于从大型数据源复制一小块数据,因此您可以按照计算机或程序可以处理的任何速度处理它。如果你想要另一个函数来填充它,你可以在你的函数之外声明缓冲区,或者如果你要填充它并自己使用它,你可以将它声明为局部变量。这是一个非常通用的术语。
一些例子:
答案 1 :(得分:1)
在您链接到的页面上,将“Buffer”视为“我们关心的唯一局部变量”,并将“本地声明的变量”视为“所有本地声明的非缓冲变量”。 / p>
答案 2 :(得分:1)
据我所知 语言去,缓冲是任何 数据所在的内存部分 存储像int,float变量, 字符数组等。
好吧,不仅仅是任何数据,如果是这种情况,所有变量都将存储在缓冲区中,并且该术语毫无意义。
当数据来自一个地方并转移到另一个地方时,缓冲区就是您用于临时存储的东西。通常缓冲区比单个变量保存的要多得多,但当然特殊情况下缓冲区也很小。
局部变量可以用作缓冲区,因此可以在堆栈上分配,但由于缓冲区通常较大,因此占用大量堆栈空间是不切实际的,因此通常将它们分配到其他地方。 / p>
使用缓冲区的一个示例是当程序从文件中读取时。在较低级别,磁盘只能以扇区为单位读取,因此系统将一堆扇区读入缓冲区,然后程序从缓冲区读取。
答案 3 :(得分:0)
不要太过字面意思。你的第一个定义是正确的。该缓冲区可以是局部变量,也可以位于堆上或其他内存区域......这是一个非常普遍的概念。
答案 4 :(得分:0)
根据Wikipedia:
在计算中,缓冲区是一个内存区域,用于在数据从一个地方移动到另一个地方时临时保存数据。通常,数据在从输入设备(例如键盘)检索时或者在将其发送到输出设备(例如打印机)之前存储在缓冲器中。但是,当在计算机内的进程之间移动数据时,可以使用缓冲区。这与电信中的缓冲区相当。缓冲区可以用硬件或软件实现,但绝大多数缓冲区都是用软件实现的。缓冲区通常在接收数据的速率与处理速率之间存在差异时使用,或者在这些速率可变的情况下使用,例如在打印机假脱机程序或在线视频流中。 / p>
通常,这种意义上的缓冲区是一个包含许多字节数据的数组,而不是一个只能容纳一个值的整数变量。
答案 5 :(得分:0)
buffer只是用于存储任意数据的内存块。在图中,我认为“缓冲区”旨在显示缓冲区,它被声明为局部变量,例如char myString[80];
。危险在于,如果没有严格监控放入此缓冲区的数据长度,您可以例如strcpy(...)将一些数据放入缓冲区并溢出结尾 - 此时保存的寄存器将被踩踏,并且函数的返回可能(并且几乎肯定会)造成严重破坏。
答案 6 :(得分:0)
它只是一个可以暂时保存任意数据的已分配内存块。要记住的是,如果你分配了一块内存,请务必在完成后释放它以防止溢出和其他意外行为发生。