Во-первых, стек и буфер - разные вещи, как вы, возможно, знаете.
Переполнение буфера происходит, когда программа (любого рода) пытается выполнить запись за пределы выделенной памяти, которая у нее есть.Представьте себе
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!