堆栈缓冲区溢出、堆栈下溢和堆栈溢出之间有什么区别?

Cor*_*ina 0 stack-overflow programming-languages buffer-overflow data-structures

今天我们数据结构的老师在学习栈的时候提到了这一点,但是没有给出正确的解释。

M.K*_*M.K 5

首先,正如您所知,堆栈和缓冲区是不同的东西。

当程序(任何类型)尝试写入超出其分配的内存时,就会发生缓冲区溢出。想象

int myArray[5];
myArray[9]=3;
Run Code Online (Sandbox Code Playgroud)

堆栈溢出是一种特殊情况。当运行时,例如递归函数,已经有保留的堆栈不断增长,直到比原始保留更大!

void recurse()
{
int numbers[20000];
    recurse();
}
Run Code Online (Sandbox Code Playgroud)

这永远不会结束。每个函数调用都会创建一个新的堆栈帧,并且堆栈最终将消耗比为其保留的内存更多的内存。

检查以了解更多详细信息!

堆栈下溢它类似于缓冲区溢出。通过这个例子你就明白了!

想象一下你有一个列表,并且你正在弹出元素。

我假设您知道什么是弹出,但如果您在主题中还没有这样做,那么它基本上就是删除元素。根据结构的类型,它将从一侧或另一侧带走它们!

想象一个名为 的列表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!
Run Code Online (Sandbox Code Playgroud)