0

我一直在研究缓冲区

#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];

和 :

input[i]='a';
4

2 回答 2

2

那是缓冲区溢出,而不是堆栈溢出。该代码将破坏堆栈,但如果幸运的话,您可能会看到访问冲突崩溃。它不会触发堆栈溢出,只有在调用太多函数时才会发生堆栈溢出 - 通常是通过递归。

void f()
{
    f(); // <-- stack overflow sure to happen
}

如果您正在寻找要发生的事情,则无法保证它会发生。写入数组末尾是未定义的行为。如果系统检测到你在做什么,它几乎肯定会让你崩溃,但如果你只是覆盖实际上属于你的进程的内存,它可能不会发生,直到你写到最后。

于 2013-07-19T22:19:37.847 回答
1

请参阅堆栈和堆是什么以及在哪里?

如果您生成一个无休止地调用自身的函数,您将很快发生堆栈溢出。每个函数调用都会占用栈空间,你很快就会耗尽栈空间!

void f()
{
    f();
}

在 Visual Studio 2012 中,此代码甚至产生了警告

warning C4717: 'f' : recursive on all control paths, function will cause runtime stack overflow

该函数没有在 Visual Studio 2012 上得到优化,但是,正如@MooingDuck 指出的那样,编译器可以相当聪明地发现代码中的优化和潜在错误。

当程序崩溃时,堆栈溢出的标志是在程序的调用堆栈中一遍又一遍地重复相同的函数!可能更好地看看它现在的样子,所以你现在如何在未来识别它......

于 2013-07-19T22:19:24.767 回答