2011-06-16 69 views
2

我想嘗試一個更復雜的例子,在對象中分配新的內存和進一步內部分配,但需要知道確切的時間一個計算器會發生。所以決定嘗試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的

+2

優化器可能會從計劃中刪除它。 (並且main應該返回一個int) – MByD 2011-06-16 09:02:56

+5

@MByD:'main'中的'return'語句是可選的(標準允許的例外情況)。 – ybungalobill 2011-06-16 09:03:52

+3

訪問數組中的某些元素(即第一個和最後一個)並查看是否觸發了您期望的錯誤。一般來說,如果你不訪問內存,創建一個在棧中沒有構造函數的變量作爲指針的偏移量(堆棧指針),那麼就沒有問題了。此外,如果編譯器可以檢測到數組未被使用,那麼它可以完全刪除這些變量,並將函數碰撞到void void(){}' – 2011-06-16 09:03:58

回答

5

製作富調用本身遞歸,並與每個調用一些反增。你會很快得到你的錯。

+1

是的,它給了一個分段錯誤好,但真正的問題是關於爲什麼它沒有發生遞歸沒有發生。我想優化是罪魁禍首。 – Nav 2011-06-16 09:12:17

1

嘗試,如果你有什麼在foo的功能不感興趣優化編譯-o0

+0

沒有。沒有優化編譯沒有幫助。 – Nav 2011-06-16 09:16:17