Насколько мое понимание языков идет, буфер является любой частью памяти, в которой данные хранятся как интервал, переменные плавающие, символьные массивы и т.д. Однако я читал переполнение буфера и столкнулся с этой ссылкой, в то время как чтение о схеме стека http://www.tenouk.com/Bufferoverflowc/Bufferoverflow2a.html The в этой ссылке разделяет буфер от локальных переменных функции. Это корректно? Что такое буфер затем?
На странице, на которую вы указали ссылку, думайте о «Буфере» как о «единственной локальной переменной, о которой мы заботимся», а о «Локально объявленные переменные» как о «Все локально объявленные переменные, которые не Буфер ".
Согласно Википедия :
При вычислениях буфер - это область памяти, используемая для временного хранения данных во время их перемещения из одного места в другое. Обычно данные хранятся в буфере по мере их извлечения с устройства ввода (например, клавиатуры) или непосредственно перед отправкой на устройство вывода (например, принтер). Однако при перемещении данных между процессами внутри компьютера может использоваться буфер. Это сопоставимо с буферами в электросвязи. Буферы могут быть реализованы аппаратно или программно, но подавляющее большинство буферов реализовано программно. Буферы обычно используются, когда есть разница между скоростью получения данных и скоростью, с которой они могут обрабатываться, или в случае, когда эти скорости являются переменными, например, в диспетчере очереди печати или при потоковой передаче видео в Интернете.
Обычно буфер в этом смысле представляет собой массив, содержащий много байтов данных, а не переменную, например целое число, которое может содержать только одно значение.
Не воспринимайте эту диаграмму слишком буквально. Ваше первое определение было правильным. Этот буфер может быть локальной переменной или находиться в куче или в какой-либо другой области памяти ... это очень общая концепция.
Буфер - это просто блок памяти, используемый для хранения произвольных данных. На диаграмме я думаю, что «буфер» предназначен для отображения буфера , который объявлен как локальная переменная, например char myString [80];
. Опасность заключается в том, что если длина данных, помещаемых в этот буфер, строго не контролируется, вы можете, например, strcpy (...) некоторые данные в буфер и переполняют конец - в этот момент сохраненные регистры будут вытоптаны, и возврат из функции может (и почти наверняка) нанести ущерб.
Насколько я понимаю языков идет, буфер любой часть памяти, в которой хранятся данные хранятся как переменные типа int, float, символьные массивы и т. д.
Ну, не только данные, если бы это было так, все переменные были бы сохранены в буферах, и термин был бы бессмысленным.
Буфер - это то, что вы используете для временного хранения, когда данные приходят из одного места и отправляются в другое. Обычно буфер содержит намного больше, чем одна переменная, но, конечно, есть особые случаи, когда буфер также довольно мал.
Локальная переменная может использоваться в качестве буфера, так что она будет размещена в стеке, но поскольку буферы обычно большие, было бы непрактично использовать много места в стеке, поэтому они обычно выделяются где-то еще.
Одним из примеров использования буфера является чтение вашей программой из файла. На нижнем уровне диск может быть прочитан только в единицах секторов, поэтому система считывает группу секторов в буфер, а затем ваша программа читает из буфера.
Очень абстрактная аналогия: локальные переменные - это то, с чем вы сейчас работаете; они то, что вы держите в руках. Буфер относится к источнику данных, как ложка для суповой тарелки или мерный стакан для водопроводного крана. Держать в руках ложку практичнее, чем миску с супом, а держать в руках текущую струю воды практически невозможно. В любом случае вы используете эту посуду, чтобы пить суп / воду в удобном для вас темпе.
Точнее, локальные переменные - это просто переменные, которые вы объявили внутри функции, а не снаружи. Буфер - это фрагмент памяти (обычно массив), который используется для копирования небольшого фрагмента данных из огромного источника данных, поэтому вы можете обрабатывать его с любой скоростью, с которой может справиться ваш компьютер или программа. Вы можете объявить буфер вне своей функции, если хотите, чтобы его заполняла другая функция, или вы можете объявить его как локальную переменную, если вы собираетесь заполнять его и использовать самостоятельно. Это действительно общий термин.
Некоторые примеры: