Cor*_*ina 0 stack-overflow programming-languages buffer-overflow data-structures
今天我们数据结构的老师在学习栈的时候提到了这一点,但是没有给出正确的解释。
首先,正如您所知,堆栈和缓冲区是不同的东西。
当程序(任何类型)尝试写入超出其分配的内存时,就会发生缓冲区溢出。想象
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)