在Linux上,使用C,假設我有一個動態確定的n
命名元素的數量,我必須在短時間內存儲在一個數組(int my_array[n]
)中,一個函數調用,即被調用的函數只使用很少的內存(幾百字節)。直到發生堆棧溢出爲止的剩餘堆棧大小
大部分n
很少,十分之一。但有時n
可能很大,多達1000或1000'000。
我該如何計算,我的堆棧是否可以容納n*o + p
字節而沒有溢出?
基本上:我的堆棧上剩下多少字節?
在Linux上,使用C,假設我有一個動態確定的n
命名元素的數量,我必須在短時間內存儲在一個數組(int my_array[n]
)中,一個函數調用,即被調用的函數只使用很少的內存(幾百字節)。直到發生堆棧溢出爲止的剩餘堆棧大小
大部分n
很少,十分之一。但有時n
可能很大,多達1000或1000'000。
我該如何計算,我的堆棧是否可以容納n*o + p
字節而沒有溢出?
基本上:我的堆棧上剩下多少字節?
事實上,checking available stack問題給出了很好的答案。
但更實際的答案是:不會在調用堆棧上分配大數據。
在你的情況,你可以處理不同的情況下n<100
(然後在堆棧上分配,也許是通alloca,是有道理的),當n>=100
(當時,在堆上分配與malloc
(或calloc
的情況下)和別忘了free
吧)。使閾值100
a #define
-d不變。
call stack上的典型調用幀應該在當前的筆記本電腦或臺式機上最多爲幾千字節(如果有遞歸或線程,最好不要這麼做)。總的堆棧空間通常最多爲幾兆字節(有時少得多:在內核內部,每個堆棧通常爲4K字節!)。
混合'calloc'和'alloca'是個壞消息,因爲初始化數據,而另一個不是。這可能會引入怪異的錯誤。 – Dave
好吧,它可能是'malloc'&'alloca'。 –
如果當進入主
man getrlimit
)當前堆棧指針和一個如果使用threa從步驟2記錄在第1步中與限位之間
man pthread_getattr_np
可能的重複[在C中檢查可用堆棧大小](http://stackoverflow.com/questions/53827/checking-available-stack-size-in -c) –
@BrendanLong,我看到了這個問題,但是因爲它聲明「我正在使用MinGW和GCC 3.4.5(mingw-special vista r3)」,所以答案有點以Windows爲中心。我的問題是Linux/* nix居中。 ;-) – kay
爲什麼不能使用'getrusage()'和'getrlimit()'? – sverre