我一直在研究缓冲区
#include <iostream>
using namespace std;
int main()
{
char input[3];
for(int i=0;i<100;i++){
cin>>input[i];
}
return 0;
}
程序不停地继续运行,没有溢出的迹象(在2个linux框中测试)
如果我换掉也会发生同样的事情:
cin>>input[i];
with:
input[i]='a';
答案 0 :(得分:2)
这是缓冲区溢出,而不是堆栈溢出。该代码将废弃堆栈,但如果幸运的话,您可能会看到访问冲突崩溃。它不会触发堆栈溢出,只有在调用太多函数时才会发生堆栈溢出 - 通常是通过递归。
void f()
{
f(); // <-- stack overflow sure to happen
}
如果您正在寻找可能发生的事情,则无法保证会发生。在数组末尾写入是未定义的行为。如果系统检测到你正在做什么,它几乎肯定会让你崩溃,但是如果你只是覆盖实际上属于你的进程的内存,那么在你写完过去之前可能不会发生。
答案 1 :(得分:1)
请参阅What and where are the stack and heap?
如果你生成一个无休止地调用自身的函数,你会很快得到堆栈溢出。每个函数调用都会占用堆栈空间,并且您将很快耗尽堆栈空间!
void f()
{
f();
}
在Visual Studio 2012中,此代码甚至产生了警告
warning C4717: 'f' : recursive on all control paths, function will cause runtime stack overflow
该功能并没有在Visual Studio 2012上得到优化,但是,正如@MooingDuck所指出的那样,编译器可以相当聪明地发现代码中的优化和潜在错误。
当程序崩溃时,堆栈溢出的故事标志是在程序的调用堆栈中反复重复执行相同的功能!可能更好地看看它现在看起来如何,所以你现在如何识别它...