2010-07-17 218 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

它只是一個分配的內存塊,可以暫時保存任意數據。要記住的事情是,如果你分配了一塊內存,一旦完成後一定要釋放它,以防止發生溢出和其他意外行爲。