2011-12-03 34 views
7

在Linux上,使用C,假設我有一個動態確定的n命名元素的數量,我必須在短時間內存儲在一個數組(int my_array[n])中,一個函數調用,即被調用的函數只使用很少的內存(幾百字節)。直到發生堆棧溢出爲止的剩餘堆棧大小

大部分n很少,十分之一。但有時n可能很大,多達1000或1000'000。

我該如何計算,我的堆棧是否可以容納n*o + p字節而沒有溢出?

基本上:我的堆棧上剩下多少字節?

+0

可能的重複[在C中檢查可用堆棧大小](http://stackoverflow.com/questions/53827/checking-available-stack-size-in -c) –

+0

@BrendanLong,我看到了這個問題,但是因爲它聲明「我正在使用MinGW和GCC 3.4.5(mingw-special vista r3)」,所以答案有點以Windows爲中心。我的問題是Linux/* nix居中。 ;-) – kay

+0

爲什麼不能使用'getrusage()'和'getrlimit()'? – sverre

回答

4

事實上,checking available stack問題給出了很好的答案。

但更實際的答案是:不會在調用堆棧上分配大數據。

在你的情況,你可以處理不同的情況下n<100(然後在堆棧上分配,也許是通alloca,是有道理的),當n>=100(當時,在堆上分配與malloc(或calloc的情況下)和別忘了free吧)。使閾值100 a #define -d不變。

call stack上的典型調用幀應該在當前的筆記本電腦或臺式機上最多爲幾千字節(如果有遞歸或線程,最好不要這麼做)。總的堆棧空間通常最多爲幾兆字節(有時少得多:在內核內部,每個堆棧通常爲4K字節!)。

+1

混合'calloc'和'alloca'是個壞消息,因爲初始化數據,而另一個不是。這可能會引入怪異的錯誤。 – Dave

+2

好吧,它可能是'malloc'&'alloca'。 –

4

如果當進入主

  • 在你的日常你不使用線程,或者如果你知道你的代碼執行主棧,然後

    1. 記錄當前堆棧指針,獲取當前棧限制(見man getrlimit)當前堆棧指針和一個如果使用threa從步驟2

    記錄在第1步中與限位之間

  • 比較差ds並且可能在主線程以外的線程上執行,請參閱man pthread_getattr_np