10

私の言語の理解に関する限り、バッファは、int、float変数、文字配列などのようにデータが格納されるメモリの任意の部分です。ただし、バッファオーバーフローを読んでいて、スタックhttpについて読んでいるときにこのリンクに出くわしました://www.tenouk.com/Bufferoverflowc/Bufferoverflow2a.html このリンクの図は、関数のローカル変数からバッファを分離しています。これは正しいです?では、バッファとは何ですか?

4

7 に答える 7

4

非常に抽象的なアナロジー: ローカル変数は、現在作業しているものです。それらはあなたが手に持っているものです。スプーンがスープ ボウルに、計量カップが水道の蛇口にあるように、バッファはデータ ソースにあります。スープボウルを手に持つよりも、スプーンを手に持つ方が実際的であり、流れる水の流れを手に持つことは事実上不可能です。どちらの場合も、自分に合ったペースでスープ/水を消費できるように、これらの道具を使用しています.

より具体的には、ローカル変数は、関数の外側ではなく、関数の内側で宣言した変数です。バッファは、巨大なデータ ソースからデータの小さなチャンクをコピーするために使用されるメモリのチャンク (通常は配列) であるため、コンピューターまたはプログラムが処理できるペースで処理できます。別の関数でバッファを埋めたい場合は、関数の外でバッファを宣言するか、自分でバッファを埋めて使用する場合はローカル変数として宣言します。それは本当に一般的な用語です。

いくつかの例:

  • オーディオ バッファーは、プログラムが処理するためにサウンド カードからプログラムのメモリにコピーするか、スピーカーに出力するためにプログラムのメモリからサウンド カードにコピーするために、約 0.5 秒相当のオーディオを保持する場合があります。あなたのプログラムはすぐに mp3 ファイルをデコードし、すべてのデータをカードにダンプすることができますが、そうすると最終的に数百 MB 程度になり、50 倍速で音楽を聴くのは楽しくないでしょう --少しずつデコードし、バッファに格納します。
  • インターネット接続が遅すぎるために数秒ごとに一時停止することがないように、ビデオを開始すると、YouTube からのメモリやハードディスクでビデオ バッファがいっぱいになることがあります。
  • プログラムは、文字バッファーを使用して、ある関数から別の関数にテキストを共有する場合があります。cin や ReadLine 、 gets などを使用してキーボードからテキスト入力を取得する場合は、「文字バッファー」に格納されている文字列を呼び出すのが適切です。この場合、バッファをローカル変数として宣言します。
于 2010-07-17T19:10:56.977 に答える
2

私の言語の理解に関する限り、バッファは int、float 変数、文字配列などのようにデータが格納されるメモリの任意の部分です。

データだけでなく、その場合、すべての変数がバッファに格納され、この用語は無意味になります。

バッファーは、データがある場所から別の場所に移動するときに一時的なストレージとして使用するものです。通常、バッファは 1 つの変数よりも多くの変数を保持しますが、もちろん、バッファが非常に小さい特殊なケースもあります。

ローカル変数はバッファとして使用できるため、スタックに割り当てられますが、バッファは通常大きいため、多くのスタック領域を使い果たすのは現実的ではないため、通常は別の場所に割り当てられます。

バッファが使用される 1 つの例は、プログラムがファイルから読み取る場合です。下位レベルでは、ディスクはセクター単位でのみ読み取ることができるため、システムは一連のセクターをバッファーに読み取り、プログラムはバッファーから読み取ります。

于 2010-07-17T18:40:33.773 に答える
1

リンク先のページで、「バッファ」を「私たちが気にする唯一のローカル変数」と考え、「ローカルで宣言された変数」を「バッファではないすべてのローカルで宣言された変数」と考えてください。

于 2010-07-17T18:32:05.277 に答える
0

これは単に、任意のデータを一時的に保持できる、割り当てられたメモリ ブロックです。これに関して覚えておくべきことは、メモリのブロックを割り当てる場合は、オーバーフローやその他の予期しない動作が発生するのを防ぐために、完了したら必ず解放することです。

于 2015-05-26T23:58:38.203 に答える
0

その図を文字通りに受け取らないでください。最初の定義は正しかった。そのバッファは、ローカル変数にすることも、ヒープまたは他のメモリ領域に置くこともできます...これは非常に一般的な概念です。

于 2010-07-17T18:30:18.607 に答える
0

ウィキペディアによると:

コンピューティングでは、バッファーは、データをある場所から別の場所に移動する間、データを一時的に保持するために使用されるメモリの領域です。通常、データは入力デバイス (キーボードなど) から取得されるとき、または出力デバイス (プリンターなど) に送信される直前にバッファーに格納されます。ただし、コンピューター内のプロセス間でデータを移動する場合は、バッファーを使用できます。これは、電気通信におけるバッファに匹敵します。バッファはハードウェアまたはソフトウェアで実装できますが、大部分のバッファはソフトウェアで実装されます。バッファーは通常、データを受信する速度と処理できる速度に差がある場合、またはプリンター スプーラーやオンライン ビデオ ストリーミングなどでこれらの速度が可変である場合に使用されます。

通常、この意味でのバッファは、単一の値しか保持できない整数のような変数ではなく、多数のバイトのデータを含む配列になります。

于 2010-07-17T18:32:00.207 に答える
0

バッファは、任意のデータを格納するために使用される単なるメモリのブロックです。図では、「buffer」はローカル変数として宣言されているバッファを示すことを意図していると思いますchar myString[80];。危険なのは、このバッファに入れられるデータの長さが厳密に監視されていない場合、たとえば strcpy(...) いくつかのデータをバッファに入れ、最後にオーバーフローする可能性があることです-その時点で、保存されたレジスタが踏みにじられて、関数からの戻りは、大混乱を引き起こす可能性があります (ほぼ確実にそうなります)。

于 2010-07-17T18:33:14.697 に答える