[英]Array buffer overflow
我一直在研究緩沖
#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';
那是緩沖區溢出,而不是堆棧溢出。 該代碼將破壞堆棧,但是如果幸運的話,您可能會看到訪問沖突崩潰。 它不會觸發堆棧溢出,只有在您調用太多函數(通常是通過遞歸)時才會發生。
void f()
{
f(); // <-- stack overflow sure to happen
}
如果您正在尋找可能發生的事情,則不能保證一定會發生。 超出數組末尾的寫入是未定義的行為。 如果系統檢測到您正在執行的操作,幾乎肯定會使您崩潰,但是如果您只是覆蓋實際上確實屬於您的進程的內存,則可能要等到您寫完結尾之后,才會發生。
請參閱堆棧和堆在哪里?
如果產生一個不斷調用自身的函數,則很快就會導致堆棧溢出。 每個函數調用都會占用堆棧空間,並且您很快就會用完堆棧空間!
void f()
{
f();
}
在Visual Studio 2012中,此代碼甚至產生警告
warning C4717: 'f' : recursive on all control paths, function will cause runtime stack overflow
該功能尚未在Visual Studio 2012上進行優化,但是正如@MooingDuck指出的那樣,編譯器可以非常聰明地發現優化和代碼中的潛在錯誤。
當程序崩潰時,堆棧溢出的跡象表明在程序的調用堆棧中反復看到相同的函數! 大概更好地了解它的外觀,以便您現在如何在將來識別它...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.