В чем разница между переполнением буфера стека, переполнением стека и переполнением стека? - PullRequest
0 голосов
/ 26 марта 2019

Мой учитель из структур данных упомянул об этом сегодня во время наших лекций при изучении стека, но не дал надлежащего объяснения этому.

Ответы [ 2 ]

2 голосов
/ 26 марта 2019

Во-первых, стек и буфер - разные вещи, как вы, возможно, знаете.

Переполнение буфера происходит, когда программа (любого рода) пытается выполнить запись за пределы выделенной памяти, которая у нее есть.Представьте себе

int myArray[5];
myArray[9]=3;

Переполнение стека - это особый случай.При запуске, например, рекурсивной функции, стек, который уже имел резервирование, продолжает расти, чтобы быть больше, чем первоначальное резервирование!

void recurse()
{
int numbers[20000];
    recurse();
}

Это никогда не закончится.Каждый вызов функции создает новый фрейм стека, и этот стек в конечном итоге потребляет больше памяти, чем зарезервировано для него.

Проверьте this для получения более подробной информации!

И Переполнение стека похоже на переполнение буфера.С этим примером вы поймете это!

Представьте, что у вас есть список, и вы добавляете элементы.

Я предполагаю, что вы знаете, что такое всплывающее окно, но в том случае, если вы все еще не сделали этого в своем предмете, он в основном убирает элементы.В зависимости от типа структуры, они будут взяты с одной или другой стороны!

Представьте, что список с именем List содержит три числа: [1,2,3].Я напишу это так: List => [1,2,3] Что означает «Список содержит [1,2,3]».

List => [1,2,3]
List.pop => [2,3] //List.pop now contains (->) [2,3]
List.pop => [3]
List.pop => []
List.pop => ??? Stack underflow!
2 голосов
/ 26 марта 2019

Переполнение буфера - это очень общий термин, описывающий ситуацию, в которой у вас буфер заполнен большим количеством элементов, чем следует, что приводит к неопределенному поведению. Представьте, что у вас есть массив из 1024 байтов для чтения 1 КБ из сети, и вы пытаетесь поместить в него больше.

Переполнение стека вызовов - это ситуация, в которой слишком много вызовов функций (обычно это происходит, когда у вас неограниченная рекурсия), когда именно из-за их количества компьютер имеет тенденцию исчерпывать память для выделения слишком большого количества кадров стека. (представьте, что каждый кадр стека имеет размер по умолчанию, около 2 МБ iirc в linux по умолчанию - если вы получите дерево вызовов стека глубиной в тысячи функций, возможно, вам не хватит памяти).

...