我想嘗試一個更復雜的例子,在對象中分配新的內存和進一步內部分配,但需要知道確切的時間一個計算器會發生。所以決定嘗試this的例子。我從main()
調用foo()
函數,並期望它給出一個stackoverflow錯誤。它沒有。在foo中,我將數組大小增加了幾個零,並在foo中增加了40個這樣的數組聲明。仍然沒有崩潰。
我使用的是gcc版本4.4.2 20091027(Red Hat 4.4.2-7)(GCC)。不應該大約1MB以上的堆棧分配給出一個stackoverflow錯誤?Stackoverflow沒有發生,試圖找出是否分配堆棧或堆內存
void foo()
{
double x[100000000];
double x1[100000000];
double x2[100000000];
double x3[100000000];
double x4[100000000];
//...and many more
}
int main()
{
foo();
}
編譯爲GCC -o測試test.c的
優化器可能會從計劃中刪除它。 (並且main應該返回一個int) – MByD 2011-06-16 09:02:56
@MByD:'main'中的'return'語句是可選的(標準允許的例外情況)。 – ybungalobill 2011-06-16 09:03:52
訪問數組中的某些元素(即第一個和最後一個)並查看是否觸發了您期望的錯誤。一般來說,如果你不訪問內存,創建一個在棧中沒有構造函數的變量作爲指針的偏移量(堆棧指針),那麼就沒有問題了。此外,如果編譯器可以檢測到數組未被使用,那麼它可以完全刪除這些變量,並將函數碰撞到void void(){}' – 2011-06-16 09:03:58