可能是重复问题:
什么是堆栈溢出和缓冲区溢出的区别?
什么是堆栈溢出和缓冲区溢出的区别?
缓冲区溢出和缓冲区越界的区别是什么?
缓冲区越界和堆栈溢出的区别是什么?
请提供代码示例。我查看了维基百科中的这些术语,但无法将其与C、C++或Java编程相匹配。
缓冲区溢出和缓冲区越界的区别是什么?
缓冲区越界和堆栈溢出的区别是什么?
请提供代码示例。我查看了维基百科中的这些术语,但无法将其与C、C++或Java编程相匹配。
将缓冲区视为仅仅是一个数组。人们常常混用“溢出”和“越界”这两个词,来描述当你尝试引用超出数组末尾的索引时,这是可以的。就我个人而言,我会有所区分:
缓冲区溢出是指当你尝试往数组中放入超过它本身容量的项时,它们会从缓冲区的末尾溢出。换句话说,这是由于写入操作导致的。
缓冲区越界是指在遍历缓冲区时,继续读取超出数组末尾的位置。你的迭代器正在遍历缓冲区并且持续前进。换句话说,这是由于读取操作导致的。
堆栈溢出则完全不同。大多数现代编程环境都是基于堆栈的,它们使用堆栈数据结构控制程序流程。每次调用函数时,一个新的项目被放置在程序的调用堆栈上。当函数返回时,项目从堆栈中弹出。当堆栈为空时,程序停止运行。问题在于,这个堆栈有一个限制大小。可能会一次性调用太多的函数,填满整个堆栈。此时就会出现堆栈溢出。最常见的做法是函数调用自身(递归)。
缓冲区溢出/缓冲区覆盖:
void k()
{
BYTE buf[5];
for( int i = 0; i < 10; ++i )
buf[i] = 0xcd;
}
Stackoverflow:
void f()
{
int k = 0;
f();
}
在C/C++中,缓冲区溢出(buffer overflow)和缓冲区越界(buffer overrun)之间存在差异:
堆栈溢出(stack overflow)有点类似于缓冲区溢出,当你填满整个堆栈“内存缓冲区”时会发生。